2016-09-28 5 views
0

В настоящее время я работаю над сервисом WCF и его потребителем. До вчерашнего дня служба работала отлично. Я мог бы вызвать методы как обычно, так и асинхронные. Но: Затем я добавил несколько новых методов в интерфейс и класс сервиса. Затем я использовал svcutil.exe для создания Service.cs и output.config для клиента. Теперь методы async больше не возвращают возвращаемый тип, а некоторые «Задача < [Имя метода] Результат».Вызов метода WCF Async возвращает объект ответа

Это как мой 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 TryUserLogin и TryUserLoginAsync метода выглядели следующим образом:

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; 

Тем не менее, мне действительно было бы интересно найти решение для исправления сгенерированного файла.

Смежные вопросы