我开发了一个自定义操作过滤器,以便将其用于在 ASP.NET MVC 中记录我的 Web 服务的响应。但是我不知道为什么当我将此操作过滤器添加到我的方法时,我的控制器的 HTTP 状态响应更改为 500 并返回消息:500 Intenal Server Error
. 我将所有逻辑都放在 try catch 块中,但问题仍然存在。
这是我的自定义 ActionFilter:
public class LogActionFilter : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
try
{
Log("OnActionExecuting", actionExecutedContext);
}
catch (Exception)
{
}
}
private void Log(string methodName, HttpActionExecutedContext context)
{
try
{
string resopnseBody = getBodyFromResponse(context);
HttpResponseMessage response = context.Response;
var headers = response.Headers;
var content = response.Content;
var actionName = response.ToString();
var message = "";
message = String.Format("response:{0}", resopnseBody);
Debug.WriteLine(message, "");
}
catch (Exception e)
{
}
}
private string getBodyFromResponse(HttpActionExecutedContext context)
{
string data;
using (var stream = context.Response.Content.ReadAsStreamAsync().Result)
{
if (stream.CanSeek)
{
stream.Position = 0;
}
data = context.Response.Content.ReadAsStringAsync().Result;
}
return data;
}
}
更新:进一步调查我的代码,我发现调用getBodyFromResponse
会导致此错误。我自己怀疑我会尝试.Result
两次读取流的部分,但是因为我复制了!来自其他地方的这段代码我不清楚它的逻辑。
Update2:这是我的控制器中的示例方法:
[LogActionFilter]
[System.Web.Http.HttpPost]
public async Task<IHttpActionResult> Test()
{
return Ok(new WebServiceResult { responseCode = 0, responseMessage = null });
}
更新 3:替换
resopnseBody = getBodyFromResponse(context);
下线固定问题,但我不知道为什么!
resopnseBody = context.Response.Content.ReadAsStringAsync().Result;