WCF 异步方法调用返回响应对象

Posted

技术标签:

【中文标题】WCF 异步方法调用返回响应对象【英文标题】:WCF Async Method call returns a response object 【发布时间】:2017-02-06 00:14:10 【问题描述】:

我目前正在开发 WCF 服务和使用它的客户端。 直到昨天,该服务运行良好。我可以正常调用这些方法,也可以异步调用。 但是:然后我在接口和服务类中添加了一些新方法。然后我使用 svcutil.exe 为客户端生成 Service.cs 和 output.config。 现在异步方法不再返回它们的返回类型,而是一些“Task”类型。

这就是我的 IService.cs 的样子:

public interface IService
[OperationContract]
string GetData(int value);

[OperationContract]
LoginResultSet TryUserLogin(int clientID, string inputValue);

[OperationContract]
LoginResultSet TryClientLogin(string computerName);

[OperationContract]
bool IsClientLoggedIn(int clientID);

[OperationContract]
LoginResultSet TryClientLogout(int clientID);

[OperationContract]
LoginResultSet TryUserLogout(int clientID, UserClass user);

[OperationContract]
DataTable GetTestJU(int index);

[OperationContract]
DataTable GetJUHistory(UserClass user, int maxCount);

[OperationContract]
DataTable GetJU(UserClass user, string inputValue);

问题在登录时就已经开始了。在我生成的 Service.cs 的 previous 版本中,TryUserLoginTryUserLoginAsync 方法如下所示:

 public LoginResultSet TryUserLogin(int ClientID, string InputValue)

    return base.Channel.TryUserLogin(ClientID, InputValue);


public System.Threading.Tasks.Task<LoginResultSet> TryUserLoginAsync(int ClientID, string InputValue)

    return base.Channel.TryUserLoginAsync(ClientID, InputValue);

这是完美的工作。

但在新的 Service.cs 中,我得到了这个:

[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
TryUserLoginResponse IService.TryUserLogin(TryUserLoginRequest request)

    return base.Channel.TryUserLogin(request);


public LoginResultSet TryUserLogin(int clientID, string inputValue)

    TryUserLoginRequest inValue = new TryUserLoginRequest();
    inValue.clientID = clientID;
    inValue.inputValue = inputValue;
    TryUserLoginResponse retVal = ((IService)(this)).TryUserLogin(inValue);
    return retVal.TryUserLoginResult;


[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
System.Threading.Tasks.Task<TryUserLoginResponse> IService.TryUserLoginAsync(TryUserLoginRequest request)

    return base.Channel.TryUserLoginAsync(request);


public System.Threading.Tasks.Task<TryUserLoginResponse> TryUserLoginAsync(int clientID, string inputValue)

    TryUserLoginRequest inValue = new TryUserLoginRequest();
    inValue.clientID = clientID;
    inValue.inputValue = inputValue;
    return ((IService)(this)).TryUserLoginAsync(inValue);

我完全不知道我做错了什么。我注意到在新的 Service.cs 中,方法前面的属性始终来自 System.ComponentModel 命名空间,而在旧的(工作)中,属性来自 System.Runtime.Serialization 命名空间,这些属性的数量要少得多.

我真的希望有人能帮忙,我有点绝望。

【问题讨论】:

【参考方案1】:

我仍然不知道为什么返回值存在这个问题,但我通过构建自己的任务并使用“正常”登录方法来避免这个问题,如下所示:

LoginResultSet result = new LoginResultSet();
Task<LoginResultSet> loginTask = new Task<LoginResultSet>(() =>

    return WCFClient.TryClientLogin(Environment.MachineName);
);
loginTask.Start();
await Task.WhenAll(loginTask);

result = loginTask.Result;

不过,我对修复生成文件的解决方案非常感兴趣。

【讨论】:

以上是关于WCF 异步方法调用返回响应对象的主要内容,如果未能解决你的问题,请参考以下文章

WCF 请求返回错误响应

从 WCF 服务调用异步方法

如何使用 WCF 调用从客户端 windows phone 8.0 silverlight 返回对象的方法

ASP.NET Web 表单 - 如何异步调用 WCF 异步方法?

WCF 仅异步操作

如何从异步调用返回响应