Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.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# 如何在MVC3中同时返回状态代码、状态描述和文本?_C#_.net_Asp.net Mvc 3 - Fatal编程技术网

C# 如何在MVC3中同时返回状态代码、状态描述和文本?

C# 如何在MVC3中同时返回状态代码、状态描述和文本?,c#,.net,asp.net-mvc-3,C#,.net,Asp.net Mvc 3,从我的MVC3控制器操作中,我想返回HTTP 403,将“状态描述”设置为某个特定字符串,并在结果内容中返回该字符串,以便在浏览器中可见 我可以返回ContentResult来指定内容,但不能返回状态代码(如403)和状态描述。我可以使用HttpStatusCodeResult指定状态代码和状态描述,但不能指定结果内容 我如何制作一个包含所有三个的动作结果?如果这不是太脏的话 Response.Clear(); Response.Write("Some specific string"); re

从我的MVC3控制器操作中,我想返回HTTP 403,将“状态描述”设置为某个特定字符串,并在结果内容中返回该字符串,以便在浏览器中可见

我可以返回
ContentResult
来指定内容,但不能返回状态代码(如403)和状态描述。我可以使用
HttpStatusCodeResult
指定状态代码和状态描述,但不能指定结果内容


我如何制作一个包含所有三个的动作结果?

如果这不是太脏的话

Response.Clear();
Response.Write("Some specific string");
return new HttpStatusCodeResult(403, "another specific string");

通常情况下,您会看到通过设置响应代码,然后返回常规ActionResult来完成此操作

public ActionResult Foo() 
{ 
    Response.StatusCode = 403;
    Response.StatusDescription = "Some custom message";

    return View(); // or Content(), Json(), etc
}
如果你真的需要它成为一个ActionResult,你可以创建自己的

例如:

public class HttpStatusContentResult : ActionResult
{
    private string _content;
    private HttpStatusCode _statusCode;
    private string _statusDescription;

    public HttpStatusContentResult(string content, 
                                   HttpStatusCode statusCode = HttpStatusCode.OK,
                                   string statusDescription = null)
    {
        _content = content;
        _statusCode = statusCode;
        _statusDescription = statusDescription;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        var response = context.HttpContext.Response;
        response.StatusCode = (int) _statusCode;
        if (_statusDescription != null)
        {
            response.StatusDescription = _statusDescription;
        }

        if (_content != null)
        {
            context.HttpContext.Response.Write(_content);
        }
    }
}

在我意识到问题出在GetAwaiter()上之前,我疯狂地试图让这段代码正常工作。以下是我得到的版本:

public class ApiControllerBase : ApiController
{
   ...
   // Other code
   ...

   public override Task<HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
   {
      return base
         .ExecuteAsync(controllerContext, cancellationToken)
         .ContinueWith(t =>
         {
            t.Result.Headers.CacheControl = new CacheControlHeaderValue()
            {
               NoStore = true,
               NoCache = true,
               MaxAge = new TimeSpan(0),
               MustRevalidate = true
            };
            t.Result.Headers.Pragma.Add(new NameValueHeaderValue("no-cache"));
            t.Result.Content.Headers.Expires = DateTime.Parse("01 Jan 1990 00:00:00 GMT");

            return t.Result;
         }, cancellationToken);
   }
}
公共类ApiController数据库:ApiController
{
...
//其他代码
...
公共覆盖任务ExecuteAsync(HttpControllerContext controllerContext,CancellationToken CancellationToken)
{
返回基地
.ExecuteAsync(controllerContext,cancellationToken)
.ContinueWith(t=>
{
t、 Result.Headers.CacheControl=新的CacheControlHeaderValue()
{
NoStore=正确,
NoCache=true,
最大年龄=新的时间跨度(0),
MustRevalidate=true
};
t、 Add(新的NameValueHeaderValue(“无缓存”);
t、 Result.Content.Headers.Expires=DateTime.Parse(“01 Jan 1990 00:00:00 GMT”);
返回t.Result;
},取消令牌);
}
}

为什么不使用自定义Json({code:descr:})调用?@Tigran:IMO为了这个简单的目的,这将是一种过分的杀伤力。据我所知,这是不可能的,所以您需要创建esplicit组合对象。在这种情况下,imo最简单的解决方案是定制Json对象。但我不是ASP.NET专家,可能有更简单的解决方案。或者类似地,
Response.StatusCode=403;Response.StatusDescription=“foo”;返回内容(“错误请求伴侣”)如果在代码之前对响应进行了处理,请不要忘记首先清除响应:
response.clear()
如果
\u statusDescription
为空,您可以将其赋值为
HttpWorkerRequest.GetStatusDescription(response.StatusCode)
,这在引擎盖下是一个在
string[]]s\u HTTPStatusDescriptions
中快速查找的值,类似于
s\u HTTPStatusDescriptions[StatusCode/100][StatusCode>。检索到的值始终是状态代码的简短描述,如“确定”或“禁止”,或者如果找不到匹配的描述,则为空字符串。我尝试了此解决方案,在IIS express上运行时效果良好,但在prod上运行时效果不佳。从我的ajax请求中,我希望_内容值映射到responseText,但是在prod server IIS上,它也映射到statusText,请参考这个谁也有同样的问题Just a heads for now days和http2。Http2不支持状态描述。说“HTTP/2没有定义一种方式来携带包含在HTTP/1.1状态行中的版本或原因短语。”ApiController不在MVC3中,而是在Web API中,它在.NET Core之前没有与MVC合并