C# WCF方法不返回

C# WCF方法不返回,c#,wcf,C#,Wcf,我对WCF服务有一个奇怪的问题,我一直无法解决。 当我在我的服务上调用一个特定的方法时,它在绑定超时之前不会返回到客户机,尽管它已经在服务器上返回,并且返回消息已经发送到客户机 我在客户端使用ChannelFactory,共享接口的定义如下: [ServiceContract] interface IService { [OperationContract] bool Upload(Guid id, string name, byte[] data); [OperationCon

我对WCF服务有一个奇怪的问题,我一直无法解决。 当我在我的服务上调用一个特定的方法时,它在绑定超时之前不会返回到客户机,尽管它已经在服务器上返回,并且返回消息已经发送到客户机

我在客户端使用
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跟踪,它可以帮到您很多!