HTTP失败响应覆盖非本地客户端的响应正文
本文关键字:响应 客户端 正文 失败 覆盖 HTTP | 更新日期: 2023-09-27 17:57:28
我正在为一些公共页面创建一个锁定机制,该机制应该只允许一个用户同时编辑它们。客户端对请求锁的服务器进行GET API调用,该调用返回一个MVC ActionResult对象。出于某种原因,当我在本地运行程序并返回new HttpConflictResult("Cannot acquire lock", message);
(表示获取锁失败)时,它工作得很好。错误消息可以正确发送和接收,并且可以显示在警报或任何需要的内容中。但是,当我远程访问网站时,消息会被覆盖为"由于发生冲突,页面未显示。"我是做错了什么,还是这是IIS的"功能"或其他什么?如果是,有没有办法绕过它,这样我仍然可以得到我想要给客户的消息?
提前感谢您的帮助!
编辑:对不起,忘记了HttpConflictResult是一个继承的类。这里有一些信息:
public class HttpConflictResult : HttpErrorResult
{
public HttpConflictResult() : this(string.Empty) { }
public HttpConflictResult(string errorMessageResource) : this("Conflict", errorMessageResource, true) { }
public HttpConflictResult(string statusMessage, string errorMessage) :
base(409, statusMessage, errorMessage) { }
}
public class HttpErrorResult : ActionResult
{
protected int _statusCode;
protected string _statusMessage;
protected string _errorMessage;
public HttpErrorResult(int statusCode, string statusMessage, string errorMessageResource)
{
_statusCode = statusCode;
_statusMessage = statusMessage;
_errorMessage = errorMessage;
}
public override void ExecuteResult(ControllerContext context)
{
context.HttpContext.Response.StatusCode = _statusCode;
context.HttpContext.Response.StatusDescription = _statusMessage;
if(_errorMessage != null)
{
context.HttpContext.Response.ContentType = "application/json; charset=utf-8";
context.HttpContext.Response.Clear();
System.Web.Script.Serialization.JavaScriptSerializer ser = new System.Web.Script.Serialization.JavaScriptSerializer();
context.HttpContext.Response.Write(ser.Serialize(new { message = _errorMessage }));
}
}
}
如果我遗漏了什么,请告诉我。再次感谢!
如果您正在设置错误代码(即4xx或5xx范围内的http状态代码),并且您在IIS 7下运行,则需要确保您已告知IIS不要使用标准错误消息。
使用Response
对象上的TrySkipIisCustomErrors
参数可以执行此操作。尝试修改您的HttpErrorResult如下:
public override void ExecuteResult(ControllerContext context)
{
// Set TrySkipIisCustomErrors to ensure ASP.NET sends your error content to the
// user instead of the default ASP.NET content under IIS 7.
context.HttpContext.Response.TrySkipIisCustomErrors = true;
context.HttpContext.Response.StatusCode = _statusCode;
context.HttpContext.Response.StatusDescription = _statusMessage;
if(_errorMessage != null)
{
[...]
}
}