簡體   English   中英

Web API“請求”為空

[英]Web API 'Request' is null

我正在嘗試使用“請求”從POST Web API操作返回HttpResponseException

throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "File not in a correct size"));

這樣做的時候,我得到的Value cannot be null. Parameter name: request Value cannot be null. Parameter name: request

基本上 - 請求為空。

我錯過了什么?

謝謝

我在我的ApiController中發現我的Request對象為null,因為我在另一個中嵌套了一個ApiController調用。 因此,第二個嵌套的ApiController從未被初始化。 您無法手動初始化它,但您可以利用Request對象上的setter從包裝器傳遞到嵌套的ApiController。 下面是一個模型,在我的實際代碼中修復了我的Request.CreateErrorResponse(...)錯誤。

public class WrapperController : ApiController
{
    // POST api/wrapper
    public void Post(ComplexWithChild value)
    {
        var other = value.otherdata;

        var childcontroller = new ChildController();
        childcontroller.Post(value.child); // ChildController is not initialized, and has null Request
        /*inside ChildController...// causes null reference exception due to null Request
            Request.CreateErrorResponse(HttpStatusCode.BadRequest, "my message"); 
        */

        childcontroller.Request = this.Request;
        childcontroller.Post(value.child); // ChildController uses same Request
        /*inside ChildController...// this works now
            Request.CreateErrorResponse(HttpStatusCode.BadRequest, "my message"); 
        */
    }
}

public class ChildController : ApiController
{
    public void Post(Child value)
    {
        throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "my message"));
    }
}

用這個:

HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.InternalServerError);
message.Content = new ObjectContent(typeof(MessageResponse), "Invalid Size", GlobalConfiguration.Configuration.Formatters.JsonFormatter);
throw new HttpResponseException(message);

注意:您可以使用您可能要為用戶返回的任何對象更改“無效大小”。 例如:

public ErrorMessage
{
     public string Error;
     public int ErrorCode;
}

ErrorMessage msg = new ErrorMessage();
msg.Error = "Invalid Size";
msg.ErrorCode = 500;

HttpResponseMessage message = new HttpResponseMessage(HttpStatusCode.InternalServerError);
message.Content = new ObjectContent(typeof(MessageResponse), msg, GlobalConfiguration.Configuration.Formatters.JsonFormatter);
throw new HttpResponseException(message);

像@ DavB.cs這樣嵌套ApiControllers的人的另一個解決方案是:

public class ParentController : ApiController
{
    public IHttpActionResult Foo()
    {
       ChildRepository.Foo();
       return Ok(...);
    }
}

public class ChildRepository : ApiController
{
    public HttpResponseMessage Foo()
    {
        // Do something
        return Request.CreateResponse(...);
    }
}

只是簡單地從ParentController傳遞Request:

public class ParentController : ApiController
    {
        public IHttpActionResult Foo()
        {
           ChildRepository.Foo(Request);
           return Ok(...);
        }
    }

    public class ChildRepository
    {
        public HttpResponseMessage Foo(HttpRequestMessage request)
        {
            // Do something
            return request.CreateResponse(...);
        }
    }

請求來自ApiController。 這將使您超過“請求為空”問題。

希望這有助於某人。

nizari的答案是正確的,但我最終使用以下內容:

throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
                    {
                        Content = new StringContent("Invalid image dimensions. Image file must be " + image.Width + "x" + image.Height + "px"),
                        StatusCode = HttpStatusCode.Forbidden
                    });

並使用jqXHR.responseText訪問客戶端上的內容

感謝大家!

擴展nizari的答案,這是我為了包含ErrorMessage對象列表所做的事情:

IEnumerable errorList = new List<ErrorMessage>();

// ...

var error = new HttpError( "There were errors." ) 
{
    { "Errors", errorList }
};

var message = new HttpResponseMessage( HttpStatusCode.BadRequest )
{
    Content = new ObjectContent<HttpError>( error, GlobalConfiguration.Configuration.Formatters.JsonFormatter )
};

throw new HttpResponseException( message );

您必須創建System.Net.Http.HttpRequestMessage的新實例。 以下會奏效

var request = new HttpRequestMessage();
var response = request.CreateErrorResponse(HttpStatusCode.NotFound, "File not in a correct size");

throw new HttpResponseException(response);
HttpResponseMessage message = new  HttpResponseMessage(HttpStatusCode.InternalServerError); 
message.Content = new ObjectContent(typeof(MessageResponse),
                                    "Invalid Size",
                                    GlobalConfiguration.Configuration.Formatters.JsonFormatter); 
throw new HttpResponseException(message);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM