WebApi2 GET上的InvalidCastException'HttpResponseMessage'到'IHttpActionResult'

Evi*_*lDr 1 vb.net asp.net asp.net-web-api2

最近,我一直在关注一些WebApi2教程。我遇到的一种情况是,如果请求的GET操作返回用户权限之外的数据,那么我需要返回一个禁止代码。

Imports System.Net
Imports System.Net.Http
Imports System.Web.Http

Namespace Controllers

    Public Class MyController
        Inherits ApiController

        <Route("Records/{id}")>
        Public Function [Get](id As Int32) As IHttpActionResult
            If Not Remit.IsWithinRemit(id) Then
                Return Request.CreateErrorResponse(HttpStatusCode.Forbidden, "This data is not within your remit")
            Else
                Dim r As New CustomObject(id)
                Return Ok(r)
            End If
        End Function

    End Class

End Namespace
Run Code Online (Sandbox Code Playgroud)

不幸的是,尽管该Ok(r)部分工作正常,但CreateErrorResponse抛出了InvalidCastException

无法将类型为“ System.Net.Http.HttpResponseMessage”的对象转换为类型为“ System.Web.Http.IHttpActionResult”的对象。

我知道为什么会发生错误,但是不确定如何解决错误的正确方法。在其他线程中,人们建议这CreateErrorResponse()是WebApi2的最佳方法,但是VS创建它的示例GET请求返回IHttpActionResult。目前,对于我们的新手来说,它的东西似乎并不适合...

tod*_*dmo 5

不,这并不明显,但是您可以获取所需的内容(错误代码和消息)并从type方法返回它IHttpActionResult。无需更改返回类型或不出现错误消息。

这是帮助程序类:

public class ErrorResult : IHttpActionResult
    {
        private HttpRequestMessage Request { get; }
        private HttpStatusCode statusCode;
        private string message;

        public ErrorResult(HttpRequestMessage request, HttpStatusCode statusCode, string message)
        {
            this.Request = request;
            this.statusCode = statusCode;
            this.message = message;
        }

        public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            return Task.FromResult(Request.CreateErrorResponse(statusCode, message));
        }
    }
Run Code Online (Sandbox Code Playgroud)

您可以这样称呼它:

public IHttpActionResult MyMethod()
{
    MyServiceLayer myServiceLayer = new MyServiceLayer();
    MyType myvar;
    if (MyServiceLayer.EverythingIsOK(ref myvar))
        return Ok(myvar);
    else 
        return new ErrorResult(Request, HttpStatusCode.SomeErrorCode, "Something Is Wrong");
}
Run Code Online (Sandbox Code Playgroud)