Reputation: 1490
calling this method:
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;
}
Is causing a compile-time error:
'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.
What am I missing here?
Upvotes: 14
Views: 30710
Reputation: 47375
The runtime type of item
is probably not an instance of Product
. You should be able to do this:
var response = Request.CreateResponse(HttpStatusCode.Created, item);
Even if item
was an instance of Product
, the generic <Product>
argument is redundant and not necessary. If you used ReSharper, it would tell you that the "(Generic) Type argument specification is redundant".
Update
Does your class extend from Controller
or ApiController
? The error should be 'System.Net.Http.HttpRequestMessage' does not contain a definition for...
, not 'System.Web.HttpRequestBase' does not contain a definition for...
.
WebApi controllers should extend from ApiController
, not Controller
. In an MVC controller, this.Request
points to an instance of System.Web.HttpRequestBase
. In a WebAPI controller, this.Request
points to an instance of System.Net.Http.HttpRequestMessage
.
Upvotes: 26
Reputation: 2239
CreateResponse is an extension method defined in System.Net.Http
namespace.
Make sure to add a reference to System.Net.Http
and System.Net.Http.Formatting
in your project and add a correct using directive:
C#:
using System.Net.Http;
VB:
Import System.Net.Http
Upvotes: 19