asp.net Web API中的CreateResponse方法

时间:2012-12-20 11:38:45

标签: 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;
}

导致编译时错误:

'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.

我在这里缺少什么?

2 个答案:

答案 0 :(得分:23)

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

var response = Request.CreateResponse(HttpStatusCode.Created, item);

即使itemProduct的实例,泛型<Product>参数也是多余的,不是必需的。如果您使用了ReSharper,它会告诉您“(通用)类型参数规范是多余的”。

<强>更新

您的课程是否从ControllerApiController延伸?错误应该是'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的实例。

答案 1 :(得分:18)

CreateResponse是System.Net.Http命名空间中定义的扩展方法。 确保在项目中添加对System.Net.HttpSystem.Net.Http.Formatting的引用,并添加正确的using指令:

<强> C#:
using System.Net.Http;

<强> VB:
Import System.Net.Http