2016-09-28 79 views
0

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

这是我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的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名称空间,并且这些属性的方式较少。

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

回答

0

我仍然不知道为什么会出现与返回值的问题,但我通过建设自己的任务,并使用了“正常”的登录方法,这样避免了问题:

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

result = loginTask.Result; 

不过,我真的很感兴趣的解决方案来修复生成的文件。