我们有一个休息界面,一切正常,但有些客户希望能够通过门户网站上传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代码),但我想了解为什么这在内部发生。有没有人有任何想法?
答案 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");
}
}
}
希望这可以帮助任何有类似问题的人