سؤال

أنا في وضع صعب تتطلب فيها نقطة نهاية خدمة الويب التي تستضيفها Java على خادم IBM HTTP (IHS) رأسًا طول المحتوى ، على الرغم من أنه من المفترض أنه يتوافق مع HTTP/1.1. إذا أرسلت الرأس ، فكل شيء يعمل. إذا تركت الأمر ، فأنا أحصل على 500 رد خطأ لإبلاغني أن جسدي المنشور كان فارغًا (على الرغم من أنه لم يكن كذلك).

لقد استثمرنا وقتًا كبيرًا في عميل WCF الخاص بنا لهذه الخدمات (التي طورتها طرف ثالث) ولا يمكنني العثور على طريقة جيدة لإلحاق رأس طول المحتوى للطلب. أنا قادر على إضافة رؤوس تعسفية (أي X-Dan-Lynn-Header) إلى الطلب باستخدام iclientMessageInspector كما هو موضح في مشاركات المدونة مثل هذا, ، ولكن يبدو أن WCF يتجاهل رأس طول المحتوى.

خياراتي هي:

أ) اكتشف كيفية إجبار WCF على إلحاق رأس طول المحتوى على طلب نشر HTTP أو ،

ب) ابحث عن أو اكتب وكيل HTTP بسيط للغاية يتوافق مع يزين الطلب برأس طول المحتوى.

شكرًا!

عينة iclientmessageinspector.beforesendRequest:


public object BeforeSendRequest(ref Message request, IClientChannel channel)
{
    var buffer = request.CreateBufferedCopy(Int32.MaxValue);
    var tempRequest = buffer.CreateMessage();


    HttpRequestMessageProperty httpRequest = GetHttpRequestProp(tempRequest);
    if (httpRequest != null)
    {
        if (string.IsNullOrEmpty(httpRequest.Headers[HttpRequestHeader.ContentLength]))
        {
            httpRequest.Headers.Add(HttpRequestHeader.ContentLength, GetMessageLength(buffer).ToString());
            httpRequest.Headers.Add("X-Dan-Lynn-Header", "abcdefghijk");
        }

    }

    request = tempRequest;
    request.Properties[HttpRequestMessageProperty.Name] = httpRequest;

    return null;
}

طلب نموذج تم إنشاؤه بواسطة WCF (و IclientMessageinspector السابق):

POST /path/to/service HTTP/1.1
Content-Type: text/xml; charset=utf-8
X-Dan-Lynn-Header: abcdefghijk
SOAPAction: "http://tempuri.org/path/to/service/action"
Host: service.host.tld
Transfer-Encoding: chunked
Connection: Keep-Alive


<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
    <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
        .......body removed for clarity......

    </s:Body>
</s:Envelope>
هل كانت مفيدة؟

المحلول

اكتشفه. كان ضبط الربط لاستخدام TransferMode = "دفق" يسبب ترميز النقل: مكثف. كنا بحاجة إلى عمليات النقل التي تم بثها بسبب ردود كبيرة جدًا من خدمة الويب ، لذلك تمكنت من الذهاب مع:

سيئ:

transferMode="Streamed"

جيد:

transferMode="StreamedResponse"

تغيير الربط إلى هذا يحل المشكلة:

<basicHttpBinding>
    <binding name="MyBinding" closeTimeout="00:30:00" openTimeout="00:30:00"
      receiveTimeout="00:30:00" sendTimeout="00:30:00" allowCookies="false"
      bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
      maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="16777216"
      messageEncoding="Text" textEncoding="utf-8" transferMode="StreamedResponse"
      useDefaultWebProxy="false">
      <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="65536"
        maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      <security mode="None" />
    </binding>
  </basicHttpBinding>

نصائح أخرى

لست قادرًا حاليًا على محاولة تشغيل الرمز لمعرفة ما يحدث ولكن شيء مثل

WCFClient client = new WCFClient();
using (OperationContextScope scope = new OperationContextScope(client.InnerChannel))    
{     
    HttpRequestMessageProperty req = new HttpRequestMessageProperty();            
    req.Headers.Add("Content-Length", "YOUR CONTENT LENGTH HERE");      
    OperationContext.Current.OutgoingMessageProperties[HttpRequestMessageProperty.Name] = req;      
}

يرى http://msdn.microsoft.com/en-us/library/aa395196.aspx لمزيد من المعلومات حول كيفية استخدام كائن OperationContextScope لتضمين رؤوس إضافية.

تحديث:لا بد لي من القول إنني أجد هذه مشكلة غريبة. أتساءل لماذا لم يتم تعيين طول المحتوى. لن أكون مندهشًا إذا كانت مشكلتك الفعلية في مكان آخر.

TransferMode = StreamedResponse في app.config ساعدني أيضًا في مشكلة مماثلة لمشاةتك. كان لدي بنية WCF لـ Sync Framework و Squid Proxy 3.1.20 لم يعجبها TransferMode المتدفق شكرًا جزيلاً!

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top