我的操作方法是返回HttpResponseMessage,但是,我想摆脱Microsoft.AspNetCore.Mvc.WebApiCompatShim NuGet包(这基本上是为了在将Asp.Net Web代码移植到.Net Core时弥补差距而提供的),使用IActionResult/ActionResult而不是HttpResponseMessage.
我的操作方法如下所示:
[HttpGet]
[Route("GetTemplate")]
public async Task<HttpResponseMessage> GetTemplate(string id) {
var userAgent = this.Request.Headers.UserAgent;
bool IsWindows = true;
if(userAgent.ToString().ToLower().Contains("apple")) {
IsWindows = false; //false
}
var template = await _templateService.GetTemplateContent(id);
HttpResponseMessage responseMsg = new HttpResponseMessage();
if(IsWindows) {
responseMsg.Content = new StringContent(JsonConvert.SerializeObject(template));
responseMsg.RequestMessage = Request;
responseMsg.StatusCode = HttpStatusCode.OK;
responseMsg.Content.Headers.ContentType =
new MediaTypeHeaderValue("application/json");
} else {
responseMsg.Content = new ByteArrayContent(template.ContentBytes);
responseMsg.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") { FileNameStar = template.Name };
responseMsg.Content.Headers.Add("x-filename", template.Name);
responseMsg.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
responseMsg.Content.Headers.ContentLength = template.ContentBytes.Length;
responseMsg.RequestMessage = Request;
responseMsg.StatusCode = HttpStatusCode.OK;
}
return (responseMsg);
}
发布于 2020-04-26 09:21:02
因为您在这里没有做任何花哨的事情,所以可以在这里直接将返回对象转换成相应的操作结果。在您的示例中,您需要一个JsonResult
和一个具有自定义响应头的FileResult
:
[HttpGet]
[Route("GetTemplate")]
public async Task<HttpResponseMessage> GetTemplate(string id)
{
var userAgent = this.Request.Headers.UserAgent;
bool IsWindows = !userAgent.ToString().ToLower().Contains("apple");
var template = await _templateService.GetTemplateContent(id);
if (IsWindows)
{
return Json(template);
}
else
{
Response.Headers.Add("x-filename", template.Name);
return File(template.ContentBytes, "application/octet-stream", template.Name);
}
}
Controller
和ControllerBase
类型上有许多类似的实用程序方法,它们帮助您创建各种不同的响应消息。对于大多数用例,应该有一种内置的方式来生成响应。
发布于 2020-04-26 05:40:22
1将您的行为的签名更改为:
public async Task<IActionResult> GetTemplate
然后,您将在响应中返回数据,类似于这个return Ok(data)
。您不必序列化您的数据,您可以发送一个POCO类。这将表示.StatusCode = HttpStatusCode.OK
如果您想要向响应中添加额外的标题,可以使用来自Response
的ControllerBase
字段来实现。例如:Response.Headers.Add
,用于向响应头添加键值对。
https://stackoverflow.com/questions/61436078
复制相似问题