2016-09-28 8 views
0

現在、WCFサービスとそれを消費するクライアントで作業しています。 昨日まで、サービスは完全に機能していました。私は非同期と同様に通常のメソッドを呼び出すことができます。 しかし、次にインタフェースとサービスクラスにいくつかの新しいメソッドを追加しました。次に、svcutil.exeを使用して、クライアントのService.csとoutput.configを生成しました。 これで、非同期メソッドは戻り値の型を返さなくなりましたが、 "タスク< [MethodName] Result>"型が返されました。問題は、ログイン時にすでに開始しWCF非同期メソッド呼び出しが応答オブジェクトを返します

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);} 

これは次のように私のIService.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の以前バージョンTryUserLoginTryUserLoginAsyncで方法は、このように見えました。

しかし、新しい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; 

それでも、私は本当に生成されたファイルを修正するためのソリューションに興味があります。

関連する問題