ravendb - 当 NServiceBus 尝试安排超时时,Raven 返回 400 "Request Too Long"错误

标签 ravendb nservicebus http-status-code-400

我有一个 NServiceBus 传奇,它尝试使用 Raven 超时持久程序安排超时,但当它尝试时会出现此错误:

NServiceBus.Unicast.Transport.Transactional.TransactionalTransport [(null)] <(null)> - Failed raising 'transport message received' event for message with ID=90dadfbd-9eb6-4558-96ec-37edb642330a\17275422
    System.InvalidOperationException: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
    <HTML><HEAD><TITLE>Bad Request</TITLE>
    <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
    <BODY><h2>Bad Request - Request Too Long</h2>
    <hr><p>HTTP Error 400. The size of the request headers is too long.</p>
    </BODY></HTML>
     ---> System.Net.WebException: The remote server returned an error: (400) Bad Request.
       at System.Net.HttpWebRequest.GetResponse()
       at Raven.Client.Connection.HttpJsonRequest.ReadStringInternal(Func`1 getResponse)
       --- End of inner exception stack trace ---
       at Raven.Client.Connection.HttpJsonRequest.ReadStringInternal(Func`1 getResponse)
       at Raven.Client.Connection.HttpJsonRequest.ReadResponseString()
       at Raven.Client.Connection.HttpJsonRequest.ReadResponseJson()
       at Raven.Client.Connection.ServerClient.DirectPut(RavenJObject metadata, String key, Nullable`1 etag, RavenJObject document, String operationUrl)
       at Raven.Client.Connection.ServerClient.<>c__DisplayClass10.<Put>b__f(String u)
       at Raven.Client.Connection.ServerClient.TryOperation[T](Func`2 operation, String operationUrl, Boolean avoidThrowing, T& result)
       at Raven.Client.Connection.ServerClient.ExecuteWithReplication[T](String method, Func`2 operation)
       at Raven.Client.Connection.ServerClient.Put(String key, Nullable`1 etag, RavenJObject document, RavenJObject metadata)
       at Raven.Client.Document.HiLoKeyGenerator.PutDocument(JsonDocument document)
       at Raven.Client.Document.HiLoKeyGenerator.GetNextMax()
       at Raven.Client.Document.HiLoKeyGenerator.NextId()
       at Raven.Client.Document.HiLoKeyGenerator.GenerateDocumentKey(DocumentConvention convention, Object entity)
       at Raven.Client.Document.MultiTypeHiLoKeyGenerator.GenerateDocumentKey(DocumentConvention conventions, Object entity)
       at Raven.Client.Document.DocumentStore.<>c__DisplayClass1.<Initialize>b__0(Object entity)
       at Raven.Client.Document.InMemoryDocumentSessionOperations.GetOrGenerateDocumentKey(Object entity)
       at Raven.Client.Document.InMemoryDocumentSessionOperations.StoreInternal(Object entity, Nullable`1 etag, String id)
       at Raven.Client.Document.InMemoryDocumentSessionOperations.Store(Object entity)
       at NServiceBus.Timeout.Hosting.Windows.Persistence.RavenTimeoutPersistence.Add(TimeoutData timeout)
       at NServiceBus.Timeout.Core.TimeoutTransportMessageHandler.Handle(TransportMessage message)
       at NServiceBus.Unicast.Transport.Transactional.TransactionalTransport.OnTransportMessageReceived(TransportMessage msg)

我已重新启动 Raven 服务和 nservicebus 主机。我尝试再次重现这个传奇故事,但它仍然发生。

正在安排的超时状态消息很小:

<Messages xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.net/Invoicing.Service">
    <IPartPaymentTimeout>
        <Amount>10.00</Amount>
        <OriginalTransactionTimeUtc>2013-01-14T05:49:04.8180938Z</OriginalTransactionTimeUtc>
        <PaymentNumber>7</PaymentNumber>
        <Id>123456</Id>
        <InvoiceNumber>1234567/34567</InvoiceNumber>
    </IPartPaymentTimeout>
</Messages>

最佳答案

在我的案例中,这个问题是通过阻止 New Relic 安装自定义应用程序来解决的。 New Relic 中似乎存在一个错误,它会附加请求 header X-NewRelic-ID ,它会附加相同的数据,直到它变得太长:

X-NewRelic-ID: <hash>, <samehash>, <samehash>,.....<samehash>

在 NewRelic.xml 文件中禁用 NServiceBus.Host 的检测会阻止发送 header 。

在 NewRelic.xml 中,您还可以禁用 crossApplicationTracingEnabled .

要检测此问题,请使用 System.Diagnostics 中的跟踪:

  <system.diagnostics>
<trace autoflush="true" />
<sources>
  <source name="System.Net" maxdatasize="1024">
    <listeners>
      <add name="MyTraceFile"/>
    </listeners>
  </source>
</sources>

<sharedListeners>
  <add
    name="MyTraceFile"
    type="System.Diagnostics.TextWriterTraceListener"
    initializeData="System.Net.trace.log"
            />
</sharedListeners>

<switches>
  <add name="System.Net" value="Verbose" />
</switches>

关于ravendb - 当 NServiceBus 尝试安排超时时,Raven 返回 400 "Request Too Long"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14313800/

相关文章:

swift - 使用 Alamofire 检查服务器响应时,左括号表示什么?

arrays - 当我发布 JSON 数组时,Tomcat 返回 400

ravendb - 设置RavenDB许可证以在kubernetes中自动部署

c# - 正确的处理方式 : object not disposed along all exception paths

linq - 如何根据属性是否存在来查询 RavenDb 文档

Azure 服务总线队列上的 NServiceBus 发布-订阅

javascript - 使用nodejs连接到RavenDB

azure - 在 NServiceBus 中接收 MessageDeserialization 异常

c# - nServiceBus QA 测试工具

spring-mvc - 如何在 Spring MVC 中自定义 @RequestParam 错误 400 响应