问题
I am currently working with ASP.NET Core RC2 and I am running into some strange results. So I have an MVC controller with the following function:
public HttpResponseMessage Tunnel() {
var message = new HttpResponseMessage(HttpStatusCode.OK);
message.Content = new StringContent("blablabla", Encoding.UTF8);
message.Content.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("text/plain");
message.Headers.CacheControl = new System.Net.Http.Headers.CacheControlHeaderValue {
NoCache = true
};
return message;
}
If I call this with postman with an Accept header set to text plain I get this response:
{
"Version": {
"Major": 1,
"Minor": 1,
"Build": -1,
"Revision": -1,
"MajorRevision": -1,
"MinorRevision": -1
},
"Content": {
"Headers": [
{
"Key": "Content-Type",
"Value": [
"text/plain"
]
}
]
},
"StatusCode": 200,
"ReasonPhrase": "OK",
"Headers": [
{
"Key": "Cache-Control",
"Value": [
"no-cache"
]
}
],
"RequestMessage": null,
"IsSuccessStatusCode": true
}
I really do not understand how this is the generated reponse to the above controller. It is basically a JSON serialization of the entire message itself and does in no way contain the "blablabla" I intended to send.
The only way I have gotten the desired result is by making my controller function return string
instead of HttpResponse
, but that way I am unable to set headers like CacheControl
So my question is: why do I get this strange response? It seems like very weird behaviour to me
回答1:
According to this article, ASP.NET Core MVC does not support HttpResponseMessage
-returning methods by default.
If you want to keep using it, you can, by using WebApiCompatShim:
- Add reference to
Microsoft.AspNetCore.Mvc.WebApiCompatShim
to your project. - Configure it in
ConfigureServices()
:services.AddMvc().AddWebApiConventions();
Set up route for it in
Configure()
:app.UseMvc(routes => { routes.MapWebApiRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); });
回答2:
If you want to set Cache-Control
header with string content, try this:
[Produces("text/plain")]
public string Tunnel()
{
Response.Headers.Add("Cache-Control", "no-cache");
return "blablabla";
}
回答3:
In ASP.NET Core, modify the response as it travels through the pipeline. So for headers, set them directly as in this answer. (I've tested this for setting cookies.) You can also set the HTTP status code this way.
To set content, and therefore use a specific formatter, follow the documentation Format response data in ASP.NET Core Web API. This enables you to use helpers such as JsonResult()
and ContentResult()
.
A complete example translating your code might be:
[HttpGet("tunnel")]
public ContentResult Tunnel() {
var response = HttpContext.Response;
response.StatusCode = (int) HttpStatusCode.OK;
response.Headers[HeaderNames.CacheControl] = CacheControlHeaderValue.NoCacheString;
return ContentResult("blablabla", "text/plain", Encoding.UTF8);
}
来源:https://stackoverflow.com/questions/37429190/asp-net-core-httprequestmessage-returns-strange-json-message