asp.net Web API中的CreateResponse方法

ron*_*nen 13 asp.net-web-api

调用此方法:

public HttpResponseMessage PostProduct(Product item)
{
    item = repository.Add(item);
    var response = this.Request.CreateResponse<Product>CreateResponse(HttpStatusCode.Created, item);

    string uri = Url.RouteUrl("DefaultApi", new { id = item.Id });
    response.Headers.Location = new Uri(uri);
    return response;
}
Run Code Online (Sandbox Code Playgroud)

导致编译时错误:

'System.Web.HttpRequestBase' does not contain a definition for 'CreateResponse' and the
            best extension method overload 'System.Net.Http.HttpRequestMessageExtensions.CreateResponse<T>
(System.Net.Http.HttpRequestMessage, System.Net.HttpStatusCode, T)' has some invalid arguments.
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?

dan*_*wig 24

运行时类型item可能不是实例Product.你应该能够做到这一点:

var response = Request.CreateResponse(HttpStatusCode.Created, item);
Run Code Online (Sandbox Code Playgroud)

即使item是一个实例Product,泛型<Product>参数也是多余的,没有必要.如果您使用ReSharper,它会告诉您"(通用)类型参数规范是多余的".

更新

你的班级是延伸Controller还是ApiController?错误应该是'System.Net.Http.HttpRequestMessage' does not contain a definition for...,而不是'System.Web.HttpRequestBase' does not contain a definition for....

WebApi控制器应该从而ApiController不是扩展Controller.在MVC控制器中,this.Request指向的实例System.Web.HttpRequestBase.在WebAPI控制器中,this.Request指向的实例System.Net.Http.HttpRequestMessage.


Kar*_*ang 18

CreateResponse是在System.Net.Http命名空间中定义的扩展方法.请务必添加一个引用System.Net.Http,并System.Net.Http.Formatting在你的项目,并添加using指令正确:

C#:
using System.Net.Http;

VB:
Import System.Net.Http