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

时间:2016-09-28 07:07:15

标签: c# asp.net .net wcf asynchronous

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

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

win_mutex

问题在登录时已经开始。在我生成的Service.cs的之前版本中, TryUserLogin TryUserLoginAsync 方法如下所示:

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 中我得到了这个:

 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); } 命名空间,而在旧的(工作)命名空间中,属性来自System.ComponentModel命名空间,并且有方法少了那些属性。

我真的希望有人可以提供帮助,我有点绝望。

1 个答案:

答案 0 :(得分:0)

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

LoginResultSet result = new LoginResultSet();
Task<LoginResultSet> loginTask = new Task<LoginResultSet>(() =>
{
    return WCFClient.TryClientLogin(Environment.MachineName);
});
loginTask.Start();
await Task.WhenAll(loginTask);

result = loginTask.Result;

尽管如此,我真的对修复生成的文件的解决方案感兴趣。