C# WCF方法不返回
我对WCF服务有一个奇怪的问题,我一直无法解决。 当我在我的服务上调用一个特定的方法时,它在绑定超时之前不会返回到客户机,尽管它已经在服务器上返回,并且返回消息已经发送到客户机 我在客户端使用C# WCF方法不返回,c#,wcf,C#,Wcf,我对WCF服务有一个奇怪的问题,我一直无法解决。 当我在我的服务上调用一个特定的方法时,它在绑定超时之前不会返回到客户机,尽管它已经在服务器上返回,并且返回消息已经发送到客户机 我在客户端使用ChannelFactory,共享接口的定义如下: [ServiceContract] interface IService { [OperationContract] bool Upload(Guid id, string name, byte[] data); [OperationCon
ChannelFactory
,共享接口的定义如下:
[ServiceContract]
interface IService {
[OperationContract] bool Upload(Guid id, string name, byte[] data);
[OperationContract] bool Unlock(Guid id);
}
[ServiceContract(Name = "IService")]
interface IServiceAsync : IService {
[OperationContract] Task<bool> UploadAsync(Guid id, string name, byte[] data);
[OperationContract] Task<bool> UnlockAsync(Guid id);
}
在客户端,我使用ChannelFactory
创建一个频道,如下所示:
[ServiceBehavior(InstanceContextMode = Single, ConcurrencyMode = Multiple)]
static class Server : IService {
public bool Upload(Guid id, string name, byte[] data) { ... }
public bool Unlock(Guid id) { ... }
}
static IServiceAsync GetService() {
EndpointAddress endpoint = new EndpointAddress(/* some Uri */);
NetTcpBinding binding = /* NetTcpBinding without security */;
ChannelFactory<IServiceAsync> factory =
new ChannelFactory<IServiceAsync>(binding, endpoint);
factory.Open();
IServiceAsync proxy = factory.CreateChannel();
((IServiceChannel)proxy).Open();
return proxy;
}
static async void UseService(IServiceAsync proxy) {
try {
byte[] buffer;
do {
cancellationToken.ThrowIfCancellationRequested();
buffer = GetBytes();
bool uploaded = await proxy.UploadAsync(id, name, buffer);
} while(buffer.Length > 0);
((IClientChannel)proxy).Close();
}
catch (Exception ex) {
try {
proxy.Unlock(id);
}
catch {
// Connection may have failed
}
throw;
}
}
现在,当上传完成时,一切正常,但当上传被取消,并且cancellationToken.ThrowifcCancellationRequested()
引发异常时,我想解锁服务器。因此,我调用
proxy.Unlock(id)
,它在服务器上被调用,返回那里(通过在服务器上return true;
之前立即写入控制台来确认),但在绑定超时之前不会在客户端返回
我查看了一次网络流量,确认实际上有一条返回消息被发送到客户端。(我不知道proxy.Unlock(id)
是否只是返回或抛出一个CommunicationException
,我怀疑是第二个。)
TL;DR:WCF方法不会在客户端返回,尽管它已经在服务器端返回,但其他方法可以正常工作
那么,如果你还在这里,在那堵文字墙之后:这里出了什么问题?
如何调试或解决此问题?如果你需要更多的信息,请告诉我 更新: 多亏了丹尼尔的评论,我做了一些追踪,并设法在小范围内重现了这个问题 只有在等待异步WCF方法时使用
ConfigureAwait(false)
时,才会出现问题,引发异常,并且在下一次调用WCF方法之前没有上下文切换。我在GitHub上上传了一个小文件
这可能是WCF代理中自动实现的异步方法中的错误吗?空
try/catch
块的用途是什么?它没有任何用处。您是指包含代理.解锁(id)的那一个吗?这是因为连接可能失败,所以proxy.Unlock(id)
将抛出一个异常。但您不知道-catch中没有任何内容以及该proxy.Unlock在服务器上做什么?打开WCF跟踪,它可以帮到您很多!