从嵌套控制器返回Ok()时出现奇怪的问题

时间:2015-03-01 17:01:29

标签: asp.net-web-api

我们有一个休息界面,一切正常,但有些客户希望能够通过门户网站上传xml文件。

我解析文件上传,然后创建相应的控制器,如果数据是通过其余接口以正确的格式发送的话。

一切正常,除了从嵌套控制器返回到我的ajax的错误消息,只有当我返回Ok();我觉得很奇怪。出现问题的时候,一定出现问题已经很晚了,因为我似乎根本无法捕捉到任何异常。

我在下面用一些示例控制器评论了一些代码,以显示我的意思。

public class FileController : ApiController
{
     [HttpPost]
     public async Task<IHttpActionResult> UploadFile()
     {
           // if I return Ok(); from here it works fine..  so it's not the ajax
           // Get the file details
           var someParam = blah;
           var someData = blah;              

          try
          {
             var restController = new RestController();
             return await restController.SomeMethod(someParam, someData);
          }
          catch(Exception ex)
          {
              // No error is ever caught here
              return new HttpExceptionResult(HttpStatusCode.InternalServerError, "Error uploading file");
          }
     }
}

public class RestController : ApiController 
{
     [HttpPost]
     public async Task<IHttpActionResult> SomeMethod(someParam, someData)
     {
         // This returns fine
         return new HttpExceptionResult(HttpStatusCode.409, "Something already exists");            

         // this fails -> returns okay, but my ajax receives a 500 internal server error   
         return Ok();  
     }
}

public class HttpExceptionResult : IHttpActionResult
{
    private readonly HttpStatusCode _statusCode; 
    private readonly string _message;

    public HttpExceptionResult(HttpStatusCode statusCode, string message)
    {
        _statusCode = statusCode;
        _message = message;
    }

    public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
    {
        var response = new HttpResponseMessage(_statusCode);
        response.Content = new StringContent(_message);
        return Task.FromResult(response);
    }
}

我确信有一些东西我可以尝试直接修复它(使用我自己的类来返回200代码),但我想了解为什么这在内部发生。有没有人有任何想法?

1 个答案:

答案 0 :(得分:0)

再次重新审视此问题,看看我是否可以绕过它,到目前为止我只找到了一种方法。

技巧似乎是将当前的ControllerContext传递给新的Controller。

public class FileController : ApiController
{
    [HttpPost]
    public async Task<IHttpActionResult> UploadFile()
    {
       var someParam = blah;
       var someData = blah;              
       try
       {
           var restController = new RestController()
           {
               ControllerContext = this.ControllerContext
           };

           // This now works
           return await restController.SomeMethod(someParam, someData);
       }
       catch(Exception ex)
       {
           return new HttpExceptionResult(HttpStatusCode.InternalServerError, "Error uploading file");
       }
   }
}

希望这可以帮助任何有类似问题的人