كيف يمكنني منع عميل Soap الخاص بي .NET من بما في ذلك "الاتصال: Keepalive" في رؤوس HTTP. (باستخدام WSE3.0)

StackOverflow https://stackoverflow.com/questions/1527407

سؤال

في رأس اتصال HTTP، يتضمن عميل خدمة الويب الخاص بي:Connection: Keep-Alive

أريد تعطيل هذا. بعد القيام ببعض الأبحاث، يبدو أن الطريق للقيام بذلك هو ضبط عضو Keepalive في SoapHttpChannelOptions فئة إلى false. ولكن، لا أرى طريقة للوصول إلى / تعديل SoapHttpChannelOptions في فئة عميل WebService التي تم إنشاؤها بالنسبة لي في Visual Studio باستخدام WSE3.0 (تحسين خدمة الويب.

في حالتي، تمتد فئة كعبات التي تم إنشاؤها Microsoft.Web.Services3.WebServicesClientProtocol

لم أتمكن من العثور على أي أمثلة بحثا عن Google ومعظم أعضاء فئة Soaphttpchanneloptions موروثة في فئة WebServicesClientProtocol

soophttpchanneloptions المرجع
WebSerVicesClientProtocol مرجع

ملاحظة: أنا لا أحاول تعديل خادم الويب. أحاول تعديل عميل خدمة الويب.

هل كانت مفيدة؟

المحلول

حل واحد هو تجاوز GetWebRequest(Uri uri) طريقة.
تم العثور على المعلومات التي تقودني إلى هذا الحل على هذا منتدى MSDN Post.

الأسلوب 1: تعديل الملف التلقائي تم إنشاؤه.

لصق هذا المقتطف في ملف Reference.cs الذي تم إنشاؤه تلقائيا لك. الجانب السلبي لهذا النهج هو إذا قمت بالتجديد من أي وقت مضى محولات عميل خدمة الويب (أي تحديث مراجع الويب)، فستضطر إلى تعديل الملف مرة أخرى.

protected override System.Net.WebRequest GetWebRequest(Uri uri)
{
    System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
    webRequest.KeepAlive = false;
    return webRequest;
}

الطريقة 2: إنشاء فئة جزئية

قم بإنشاء ملف ولصق التعليمات البرمجية التالية فيه. تعديل مساحة الاسم واسم الفصل بحيث تتطابق مع موقع الويب الخاص بك.

namespace YourNamespace
{
    using System.Diagnostics;
    using System.Web.Services;
    using System.ComponentModel;
    using System.Web.Services.Protocols;
    using System;
    using System.Xml.Serialization;

    /// <summary>
    /// This partial class makes it so all requests specify
    /// "Connection: Close" instead of "Connection: KeepAlive" in the HTTP headers.
    /// </summary>
    public partial class YourServiceNameWse : Microsoft.Web.Services3.WebServicesClientProtocol
    {
        protected override System.Net.WebRequest GetWebRequest(Uri uri)
        {
            System.Net.HttpWebRequest webRequest = (System.Net.HttpWebRequest)base.GetWebRequest(uri);
            webRequest.KeepAlive = false;
            return webRequest;
        }
    }
}

ملاحظات

هذا النهج مايو العمل إذا كنت لا تستخدم WSE. كنت قادرا على لصق الطريقة المذكورة أعلاه تحت فئة WSE WSE WSESERVICE ... التي تمتد System.Web.Services.Protocols.SoapHttpClientProtocol. وبعد من اختباري، يبدو أن هذا جعله لا يشمل أي سطر اتصال HTTP على الإطلاق حيث عندما فعلت ذلك داخل فئة WSE (التي تستمد منها Microsoft.Web.Services3.WebServicesClientProtocolثم تضمنت "اتصال: إغلاق". بالنسبة الى هذا الموقع على http keepalive:

ضمن HTTP 1.1، فإن طريقة الحارس الرسمية مختلفة مختلفة. يتم الاحتفاظ بجميع الروابط على قيد الحياة، ما لم ينص على خلاف ذلك مع العنوان التالي: الاتصال: إغلاق

لذلك، في حين أنه قد لا تشمل Keepalive في الرأس بعد الآن ... أعتقد أنه في HTTP1.1 يفترض أن يكون الافتراضي.

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