Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将自定义HttpResponseMessage作为IActionResult返回_C#_Asp.net Core_Httpresponse_Actionresult_Webapi - Fatal编程技术网

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);
:)简而言之,在分配新的状态代码后,现在开始响应。请编辑您的答案,我会将其标记为正确答案