Skip to content

Commit 3e24c11

Browse files
authored
Fix for WCFCSTools issue - invalid namedPipe URL throws uncatchable exception in Visual Studio. (#5604)
1 parent f9f07b7 commit 3e24c11

File tree

2 files changed

+61
-30
lines changed

2 files changed

+61
-30
lines changed

src/dotnet-svcutil/lib/Microsoft.Svcutil.NamedPipeMetadataImporter/NamedPipeMetadataImporter.cs

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@ public class NamedPipeMetadataImporter
1515
const string UriSchemeNetPipe = "net.pipe";
1616
const string NamedPipeBindingName = "MetadataExchangeNamedPipeBinding";
1717
const string BindingNamespace = "http://schemas.microsoft.com/ws/2005/02/mex/bindings";
18-
XmlReader _xmlReader;
1918

2019
#if NET6_0_OR_GREATER
2120
[System.Runtime.Versioning.SupportedOSPlatform("windows")]
@@ -38,41 +37,65 @@ public async Task<XmlReader> GetMetadatadataAsync(Uri uri)
3837
ChannelFactory<IMetadataExchange> factory = new ChannelFactory<IMetadataExchange>(CreateNamedPipeBinding(), new EndpointAddress(uri.AbsoluteUri));
3938
IMetadataExchange proxy = factory.CreateChannel();
4039
MessageVersion messageVersion = factory.Endpoint.Binding.MessageVersion;
41-
40+
var tcs = new TaskCompletionSource<XmlReader>();
4241
try
4342
{
4443
var _message = Message.CreateMessage(messageVersion, WSTransfer.GetAction);
45-
IAsyncResult result = proxy.BeginGet(_message, new AsyncCallback(RequestCallback), proxy);
44+
IAsyncResult result = proxy.BeginGet(_message, new AsyncCallback(ar =>
45+
{
46+
try
47+
{
48+
RequestCallback(ar, tcs);
49+
}
50+
catch (Exception ex)
51+
{
52+
tcs.SetException(ex);
53+
}
54+
}), proxy);
4655

4756
while (!result.IsCompleted)
4857
{
4958
await Task.Delay(100);
5059
}
5160
}
52-
catch
61+
catch (Exception ex)
5362
{
5463
((IClientChannel)proxy).Close();
64+
tcs.SetException(ex);
5565
}
5666

5767
finally
5868
{
5969
((IClientChannel)proxy).Abort();
6070
}
6171

62-
return _xmlReader;
72+
return await tcs.Task;
6373
}
6474

65-
public void RequestCallback(IAsyncResult result)
75+
public void RequestCallback(IAsyncResult result, TaskCompletionSource<XmlReader> tcs)
6676
{
6777
if (result.CompletedSynchronously)
6878
return;
6979

7080
if (result.AsyncState is IMetadataExchange metadataClient)
7181
{
72-
Message response = metadataClient.EndGet(result);
73-
if (!response.IsFault)
82+
try
83+
{
84+
Message response = metadataClient.EndGet(result);
85+
if (!response.IsFault)
86+
{
87+
XmlReader xmlReader = response.GetReaderAtBodyContents();
88+
tcs.SetResult(xmlReader);
89+
}
90+
else
91+
{
92+
// Handle fault response
93+
tcs.SetException(new Exception("Fault response received."));
94+
}
95+
}
96+
catch (Exception ex)
7497
{
75-
_xmlReader = response.GetReaderAtBodyContents();
98+
tcs.SetException(ex);
7699
}
77100
}
78101
}

src/dotnet-svcutil/lib/src/Metadata/ServiceDescriptor.cs

Lines changed: 29 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,8 @@ public async Task ImportMetadataAsync(Action<WsdlImporter> onWsdlImporterCreated
100100
//if it's net.pipe url
101101
if (MetadataUrl != null && MetadataUrl.Scheme.Equals("net.pipe"))
102102
{
103-
string tfn;
104-
if(OperationalCtx == OperationalContext.Infrastructure)
103+
string tfn;
104+
if (OperationalCtx == OperationalContext.Infrastructure)
105105
{
106106
tfn = "net462";
107107
}
@@ -116,27 +116,35 @@ public async Task ImportMetadataAsync(Action<WsdlImporter> onWsdlImporterCreated
116116
Type type = assembly.GetType("Microsoft.Tools.ServiceModel.Svcutil.NamedPipeMetadataImporter");
117117
if (type != null)
118118
{
119-
object typeInstance = Activator.CreateInstance(type, null);
120-
MethodInfo methodInfo = type.GetMethod("GetMetadatadataAsync", BindingFlags.Public | BindingFlags.Instance);
121-
var xmlReader = await (Task<System.Xml.XmlReader>)methodInfo.Invoke(typeInstance, new object[] { MetadataUrl });
119+
try
120+
{
121+
object typeInstance = Activator.CreateInstance(type, null);
122+
MethodInfo methodInfo = type.GetMethod("GetMetadatadataAsync", BindingFlags.Public | BindingFlags.Instance);
123+
var xmlReader = await (Task<System.Xml.XmlReader>)methodInfo.Invoke(typeInstance, new object[] { MetadataUrl });
122124

123-
if (xmlReader != null)
125+
if (xmlReader != null)
126+
{
127+
Encoding encoding = Encoding.UTF8;
128+
MemoryStream stream = new MemoryStream(encoding.GetBytes(xmlReader.ReadOuterXml()));
129+
stream.Position = 0;
130+
XmlReader reader = XmlDictionaryReader.CreateTextReader(
131+
new MaxMessageSizeStream(stream, int.MaxValue),
132+
Encoding.UTF8,
133+
EncoderDefaults.ReaderQuotas,
134+
null);
135+
136+
reader.Read();
137+
reader.MoveToContent();
138+
139+
MetadataSet newSet = MetadataSet.ReadFrom(reader);
140+
(this.metadataDocumentLoader.MetadataSections as List<MetadataSection>).AddRange(newSet.MetadataSections);
141+
this.metadataDocumentLoader.State = MetadataDocumentLoader.LoadState.Successful;
142+
}
143+
}
144+
catch
124145
{
125-
Encoding encoding = Encoding.UTF8;
126-
MemoryStream stream = new MemoryStream(encoding.GetBytes(xmlReader.ReadOuterXml()));
127-
stream.Position = 0;
128-
XmlReader reader = XmlDictionaryReader.CreateTextReader(
129-
new MaxMessageSizeStream(stream, int.MaxValue),
130-
Encoding.UTF8,
131-
EncoderDefaults.ReaderQuotas,
132-
null);
133-
134-
reader.Read();
135-
reader.MoveToContent();
136-
137-
MetadataSet newSet = MetadataSet.ReadFrom(reader);
138-
(this.metadataDocumentLoader.MetadataSections as List<MetadataSection>).AddRange(newSet.MetadataSections);
139-
this.metadataDocumentLoader.State = MetadataDocumentLoader.LoadState.Successful;
146+
this.metadataDocumentLoader.State = MetadataDocumentLoader.LoadState.Failed;
147+
throw;
140148
}
141149
}
142150
}

0 commit comments

Comments
 (0)