2016-05-04 2 views
1

Я пытаюсь возвращать результаты с помощью асинхр, но вместо возвращения данных я хочу это возвращает весь объектWebMethod асинхронные Результаты Показать объект

[System.Web.Services.WebMethod(BufferResponse=false)] 
public static async Task<bool> getLogin(string username, string password) 
{ 
    Login login = new Login(); 
    Task<bool> loginVerify = login.verifyLogin(username,password); 
    await loginVerify; 
    return loginVerify.Result; 
} 

public class Login 
{ 
    public async Task<bool> verifyLogin(string username, string password) 
    { 
     return true; 
    } 
} 

Результаты Firefox Firebug показать это:

{"d":{"Result":true,"Id":2,"Exception":null,"Status":5,"IsCanceled":false,"IsCompleted":true,"CreationOptions":0,"AsyncState":null,"IsFaulted":false}} 

Почему он просто не показывает результат?

Я попытался запустить

public static async Task<bool> getLogin(string username, string password) 
{ 
    Login login = new Login(); 
    Task<bool> loginVerify = login.verifyLogin(username,password); 
    await loginVerify; 
    return false; 
} 

но отчет поджигатель был таким же, за исключением того, что сказал Результат ложного в JSON

{"d":{"Result":false,"Id":2,"Exception":null,"Status":5,"IsCanceled":false,"IsCompleted":true,"CreationOptions":0,"AsyncState":null,"IsFaulted":false}} 

Так что мой вопрос, почему он не показывается весь объект, а не просто результат?

+1

Поддерживает ли WebMethods 'async-await'? –

+0

Я так предполагаю, так как получаю результаты, и в результатах у меня есть правильный ответ. Он просто продолжает отправлять весь объект, а не только результат.Его вид меня озадачивает ..... – ArcSet

+2

Это говорит мне, что 'async-await' не поддерживается. И вы должны больше узнать о 'async-await'. –

ответ

4

Как объяснено в this answer, WebMethod не поддерживает async - await (он поддерживает другой шаблон асинхронной, APM, и вы можете конвертировать async - await в APM, но это довольно неудобно).

Итак, почему вы получаете такой странный результат? WebMethod не знает, что Task - это особый тип, поэтому он обрабатывает его, как обычный объект, путем доступа и сериализации его свойств. Это включает Result, который синхронно возвращает результат Task. Это также означает, что код не является фактически асинхронным.

0

пожалуйста конвертировать результат JSON перед возвращением it.You может использовать любой JSON конвертировать в этой

[System.Web.Services.WebMethod(BufferResponse=false)] 
public static async Task<bool> getLogin(string username, string password) 
{ 
    Login login = new Login(); 
    Task<bool> loginVerify = login.verifyLogin(username,password); 
    await loginVerify; 
    var result= new JavaScriptSerializer().Serialize(loginVerify.Result); 
    return result; 
} 
+0

не забудьте добавить ссылку на System.Web.Extensions – suulisin

+0

я последовал за это, но она по-прежнему дает мне полный объект, а не только в результате Вот ответ я получил от кода, публикуемой '{«d»: {«Результат»: «true», «Id»: 2, «Exception»: null, «Status»: 5, «IsCanceled»: false, «IsCompleted»: true, «CreationOptions» : 0, «AsyncState»: null, «IsFaulted»: false}} ' – ArcSet

+0

Это не скомпилируется:' result' является 'string', но для компиляции он должен быть' bool'. И попытка сериализации «Задачи» не имеет для меня никакого смысла. – svick

0

Это довольно просто, необходимо учитывать следующее:

[System.Web.Services.WebMethod(BufferResponse=false)] 
public static async Task<bool> getLogin(string username, string password) 
{ 
    Login login = new Login(); 
    Task<bool> loginVerify = login.verifyLogin(username, password); 
    return await loginVerify; 
} 

public class Login 
{ 
    public async Task<bool> verifyLogin(string username, string password) 
    { 
     return true; 
    } 
} 

Когда getLogin вызывается его будет создавать экземпляр класса Login и вызвать метод .verifyLogin, это возвращает Task<bool>, что означает, что он «ожидает». Когда вы получите await, вам дается значение результата boolean.

Это может быть упрощено, чтобы вернуть Task<bool> оптом, так как есть один Task. Лечить Task как единый асинхронной операции и вернуть его - позволяет потребителю await его:

[System.Web.Services.WebMethod(BufferResponse=false)] 
public static Task<bool> getLogin(string username, string password) 
{ 
    Login login = new Login(); 
    return login.verifyLogin(username, password); 
} 

async Task FooBar() 
{ 
    boolean isLoggedIn = await _loginService.getLogin(this.Username, this.Password); 
} 

Примечания

  1. Старайтесь избегать использования Task.Result, даже если он был получен.
  2. Postfix async methods (Task или Task<T>) с «Async».
+0

Я запустил это, и он по-прежнему возвращает полный объект в браузер. Результаты Firebug '{" d ": {" Результат ": true," Id ": 2," Exception ": null," Status ": 5, IsCanceled: false, IsCompleted: true," CreationOptions " : 0," AsyncState ": null," IsFaulted ": false}}' – ArcSet

+0

Что бы вы посоветовали мне сделать, чтобы настроить JSON. – ArcSet

+0

Я не уверен, что делает firebug, но я считаю, что это неверно, http://stackoverflow.com/questions/18367054/creating-an-async-webservice-method. Это пример того, как он работает так, как вы ожидали. –

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