2014-05-19 30 views
0

我有一个方法,将不会返回到浏览器的响应,我试过使用浏览器本身和铬扩展POSTMan。任务<T>在WebApi没有响应,但返回非任务工程

[AllowAnonymous] 
    [Route("getNotifications")] 
    [AcceptVerbs("Get", "Post")] 
    public Task<List<UserNotifications>> GetNotifications() 
    { 
     Task<List<UserNotifications>> userNotList = new Task<List<UserNotifications>>(() => new List<UserNotifications>{ 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 1", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 1" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 2", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 2" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 3", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 3" 
      } 
     }); 
     return userNotList; 
    } 

但是,如果我改变方法不返回类型任务...

[AllowAnonymous] 
[Route("getNotifications")] 
[Authorize] 
[AcceptVerbs("Get", "Post")] 
public List<UserNotifications> GetNotifications() 
{ 
    var newstring = ""; 
    List<UserNotifications> userNotList = new List<UserNotifications>{ 
     new UserNotifications() 
     { 
      UserId = new Guid(), 
      MessageText = "Message 1", 
      MessageTime = DateTime.Now, 
      Status = true, 
      Subject = "new message 1" 
     }, 
     new UserNotifications() 
     { 
      UserId = new Guid(), 
      MessageText = "Message 2", 
      MessageTime = DateTime.Now, 
      Status = true, 
      Subject = "new message 2" 
     }, 
     new UserNotifications() 
     { 
      UserId = new Guid(), 
      MessageText = "Message 3", 
      MessageTime = DateTime.Now, 
      Status = true, 
      Subject = "new message 3" 
     } 
    }; 

    return userNotList; 
} 

我得到的每一次

[ 
    { 
     "userId": "00000000-0000-0000-0000-000000000000", 
     "subject": "new message 1", 
     "messageText": "Message 1", 
     "messageTime": "2014-05-19T11:03:32.707957-04:00", 
     "status": true 
    }, 
    { 
     "userId": "00000000-0000-0000-0000-000000000000", 
     "subject": "new message 2", 
     "messageText": "Message 2", 
     "messageTime": "2014-05-19T11:03:32.707957-04:00", 
     "status": true 
    }, 
    { 
     "userId": "00000000-0000-0000-0000-000000000000", 
     "subject": "new message 3", 
     "messageText": "Message 3", 
     "messageTime": "2014-05-19T11:03:32.707957-04:00", 
     "status": true 
    } 
] 

为什么当我使用任务并没有得到回来之后通过测试呼叫直接返回浏览器到webapi服务?

编辑1

更改方法来这个......还是坐在旋转它的轮子出于某种原因

[AllowAnonymous] 
    [Route("getNotifications")] 
    [AcceptVerbs("Get", "Post")] 
    public async Task<List<UserNotifications>> GetNotifications() 
    { 
     Task<List<UserNotifications>> userNotList = new Task<List<UserNotifications>>(() => new List<UserNotifications>{ 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 1", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 1" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 2", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 2" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 3", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 3" 
      } 
     }); 
     return await userNotList; 
    } 

然而,当我改成了这个......

[AllowAnonymous] 
    [Route("getNotifications")] 
    [AcceptVerbs("Get", "Post")] 
    public Task<List<UserNotifications>> GetNotifications() 
    { 
     var newstring = ""; 
     List<UserNotifications> userNotList = new List<UserNotifications>{ 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 1", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 1" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 2", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 2" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 3", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 3" 
      } 
     }; 

     return Task.FromResult(userNotList); 
    } 

它返回的结果很好......任何人都可以澄清这些方法之间的区别。我冒险进入Task,asnyc的领地,等待着,但我仍然需要能够使用类似POSTMan的方式直接测试Webapi的调用。

EDIT 2 以下变化的两个工作...

[AllowAnonymous] 
    [Route("getNotifications")] 
    [AcceptVerbs("Get", "Post")] 
    public Task<List<UserNotifications>> GetNotifications() 
    { 
     var userNotList = Task.Run(
       () => new List<UserNotifications>{ 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 1", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 1" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 2", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 2" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 3", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 3" 
      } 
     }); 

     return userNotList; 
    } 

    [AllowAnonymous] 
    [Route("getNotifications")] 
    [AcceptVerbs("Get", "Post")] 
    public async Task<List<UserNotifications>> GetNotifications() 
    { 
     var userNotList = Task.Run(
       () => new List<UserNotifications>{ 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 1", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 1" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 2", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 2" 
      }, 
      new UserNotifications() 
      { 
       UserId = new Guid(), 
       MessageText = "Message 3", 
       MessageTime = DateTime.Now, 
       Status = true, 
       Subject = "new message 3" 
      } 
     }); 

     return await userNotList; 
    } 
+1

尝试“return await userNotList;” – Ishtiaq

+1

...也许使方法'async'。那么它应该工作。 –

+0

你究竟在做什么?如果你有(同步)数据要返回,只需同步返回(不包含在任务中)。 –

回答

3

创建任务,但还没有真正开始它,尝试更换你的任务建构:

Task<List<UserNotifications>> userNotList = new Task<List<UserNotifications>>(... 

下列要求:

var userNotList = Task<List<UserNotifications>>.Run(
        () => new List<UserNotifications>{...}); 

更新与编辑的例子

  1. 问题,在您添加async/await是一样的,你创建,知道该怎么做Task对象,但你实际上并不告诉开始做那个工作Run方法。
  2. 在使用Task.FromResult(userNotList)的第二个示例中,您已经获得了结果列表,并将它简单包装到完成的Task中并将其返回。

有关该主题的更多信息,我强烈建议您阅读Task-based Asynchronous Pattern

+2

技术上正确,但不应在ASP.NET上使用'Task.Run'。 –

+0

谷歌搜索'task.run asp.net'并找到你的博客文章 - 有趣的阅读,谢谢。 – Yuriy