2

我有一个 servicestack 类,它的方法可能需要一段时间才能返回。大多数情况下它会在 60 秒内返回,但有时不会。调用此服务的 JsonServiceClient 有 60 秒的超时时间。

由于客户端超时,它会中止请求。一切都如预期的那样。

但是,被调用的服务方法最终会返回——假设总共需要 75 秒。因此,客户端中止连接 15 秒后,连接完成。

这会在服务中引发一堆错误。我得到的错误是:

远程主机关闭连接 - 是的,确实如此。

System.Web.HttpException (0x80070040): The remote host closed the connection. The error code is 0x80070040.
at ServiceStack.WebHost.Endpoints.Extensions.HttpResponseExtensions.WriteToResponse(IHttpResponse response, Object result, ResponseSerializerDelegate defaultAction, IRequestContext serializerCtx, Byte[] bodyPrefix, Byte[] bodySuffix)
at ServiceStack.WebHost.Endpoints.Extensions.HttpResponseExtensions.WriteToResponse(IHttpResponse httpRes, IHttpRequest httpReq, Object result, Byte[] bodyPrefix, Byte[] bodySuffix)
at ServiceStack.WebHost.Endpoints.RestHandler.ProcessRequest(IHttpRequest httpReq, IHttpResponse httpRes, String operationName)

紧随其后的是服务堆栈无法写入响应的 am 错误。当然,这应该会失败,但它是否应该尝试发送它——因为连接已关闭?

INFO  ServiceStack.WebHost.Endpoints.Extensions.HttpResponseExtensions [(null)] - Failed to write error to response: {0}
System.Web.HttpException (0x80004005): Server cannot set content type after HTTP headers have been sent.
at System.Web.HttpResponse.set_ContentType(String value)
at ServiceStack.WebHost.Endpoints.Extensions.HttpResponseExtensions.WriteErrorToResponse(IHttpResponse httpRes, IHttpRequest httpReq, String contentType, String operationName, String errorMessage, Exception ex, Int32 statusCode)
at ServiceStack.WebHost.Endpoints.Extensions.HttpResponseExtensions.WriteToResponse(IHttpResponse response, Object result, ResponseSerializerDelegate defaultAction, IRequestContext serializerCtx, Byte[] bodyPrefix, Byte[] bodySuffix)

我有日志记录设置,只要客户端在服务操作过程中断开连接,它就会记录这些错误。产生的错误都来自这个。我试图用这个来关闭这个命名空间的注销,但它不起作用:

<logger name="ServiceStack.HttpResponseExtensionsInternal">
  <level value="OFF" />
</logger>

所以,两个问题。

1)为什么SS尝试将错误发送到关闭响应(第二个异常)

2)我如何阻止这些被记录?

(要明确一点,我喜欢 servicestack,一切都运行得很好。我只想能够只收到有关实际问题的通知)

4

0 回答 0