C# 将自定义HttpResponseMessage作为IActionResult返回
我有一个返回C# 将自定义HttpResponseMessage作为IActionResult返回,c#,asp.net-core,httpresponse,actionresult,webapi,C#,Asp.net Core,Httpresponse,Actionresult,Webapi,我有一个返回IActionResult的web api 我从这个api返回FileContentResult,如下所示 return new FileContentResult(model.Content, ContentType) { EnableRangeProcessing = true }; var content = new ByteArrayContent(bytesWithValidationData); var response = new HttpResponseMe
IActionResult
的web api
我从这个api返回FileContentResult
,如下所示
return new FileContentResult(model.Content, ContentType)
{
EnableRangeProcessing = true
};
var content = new ByteArrayContent(bytesWithValidationData);
var response = new HttpResponseMessage();
response.Content = content;
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.StatusCode = HttpStatusCode.PartialContent;
response.Content.Headers.ContentRange = new ContentRangeHeaderValue(from, to);
return new ResponseMessageResult(response);
我有一个需求,我现在想要控制自己,而不是自己决定
我没有办法这么做
基本上,我想返回我自己设计的HttpResponseMessage
,在其中我可以自己设置标题和其他内容
但是对于IActionResult
类型,我找不到任何方法来执行此操作
我认为唯一可行的方法就是使用ResponseMessageResult
类似的东西
return new FileContentResult(model.Content, ContentType)
{
EnableRangeProcessing = true
};
var content = new ByteArrayContent(bytesWithValidationData);
var response = new HttpResponseMessage();
response.Content = content;
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.StatusCode = HttpStatusCode.PartialContent;
response.Content.Headers.ContentRange = new ContentRangeHeaderValue(from, to);
return new ResponseMessageResult(response);
但它的响应与HttpResponse不同,它只返回json结果,其中包含HttpResponseMessage
对象详细信息,但实际上不返回Http响应(考虑到内容类型等),我可以从中下载文件
它给出这样的结果
return new FileContentResult(model.Content, ContentType)
{
EnableRangeProcessing = true
};
var content = new ByteArrayContent(bytesWithValidationData);
var response = new HttpResponseMessage();
response.Content = content;
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.StatusCode = HttpStatusCode.PartialContent;
response.Content.Headers.ContentRange = new ContentRangeHeaderValue(from, to);
return new ResponseMessageResult(response);
有什么方法可以返回我设计的文件结果类型http响应吗?旧版ASP.NET核心web API对原始
HttpResponseMessage
实例进行了特殊处理。ASP.NET Core没有-您的控制器操作必须返回IActionResult
的实例
在您的情况下,我建议子类化FileContentResult
并操作状态代码,然后从控制器返回子类。如下所示:
public class MyFileContentResult : FileContentResult
{
public override Task ExecuteResultAsync(ActionContext context)
{
context.HttpContext.Response.StatusCode = <your status code>;
var result = base.ExecuteResultAsync(context);
return result;
}
}
公共类MyFileContentResult:FileContentResult
{
公共覆盖任务ExecuteSultAsync(ActionContext上下文)
{
context.HttpContext.Response.StatusCode=;
var result=base.executesultasync(上下文);
返回结果;
}
}
这是经典的web API还是ASP.NET核心?@IanKemp-ASP.NET核心。因此,这是类的全名
Microsoft.AspNetCore.Mvc.IActionResult
在设置状态的行中获取此错误:(System.invalidoOperationException:“无法设置状态码,因为响应已经启动。”
当我移动行context.HttpContext.response.StatusCode=;
行上方var result=base.executesUltAsync(context);
:)简而言之,在分配新的状态代码后,现在开始响应。请编辑您的答案,我会将其标记为正确答案