سؤال

لقد بدأت للتو في إنشاء بعض خدمات WCF، ولكن لدي متطلبات لجعلها متوافقة مع الإصدارات السابقة لتطبيقات العميل القديمة (.NET 1.1 و2.0).

لقد تمكنت من تشغيل الخدمات بشكل صحيح لعملاء الإصدار 3.0 أو أكبر، ولكن عندما أقوم بنشر الخدمات باستخدام نقطة نهاية basicHttpBinding (والتي أعتقد أنها مطلوبة للتوافق الذي أحتاجه)، تقوم الخدمة بإعادة بناء توقيعات طريقتي.على سبيل المثال

public bool MethodToReturnTrue(string seedValue);

يظهر لتطبيقات العميل كـ

public void MethodToReturnTrue(string seedValue, out bool result, out bool MethodToReturnTrueResultSpecified);

لقد قمت بتجريب كل معلمات التكوين التي يمكنني التفكير فيها في app.config لتطبيق وحدة التحكم ذاتية الاستضافة، ولكن يبدو أنني لا أستطيع إجراء هذه الوظيفة كما هو متوقع.أفترض أن هذا قد يؤدي إلى حقيقة أن توقعاتي معيبة، لكنني سأفاجأ بأن خدمة WCF غير قادرة على التعامل مع نوع الإرجاع المنطقي إلى عميل من المستوى الأدنى.

يبدو ملف app.config الحالي الخاص بي هكذا.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>  
  <system.serviceModel>
    <services>
      <service behaviorConfiguration="MyServiceTypeBehaviors" Name="MyCompany.Services.CentreService.CentreService">
        <clear />
        <endpoint address="http://localhost:8080/CSMEX"    binding="basicHttpBinding" bindingConfiguration="" contract="IMetadataExchange" />
        <endpoint address="http://localhost:8080/CentreService" binding="basicHttpBinding" bindingName="Compatible" name="basicEndpoint" contract="MyCompany.Services.CentreService.ICentreService" />
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="MyServiceTypeBehaviors" >
            <serviceMetadata httpGetEnabled="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

يمكن لأي شخص تقديم المشورة، من فضلك؟

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

المحلول 2

حسنًا، كنا بحاجة إلى حل هذه المشكلة على المدى القصير، ولذلك توصلنا إلى فكرة "التشغيل البيني" أو طبقة التوافق.

بشكل أساسي، كل ما فعلناه هو إضافة خدمة ويب ASMX تقليدية إلى المشروع، واستدعاء خدمة WCF من تلك باستخدام مكالمات WCF الأصلية.تمكنا بعد ذلك من إعادة الأنواع المناسبة مرة أخرى إلى تطبيقات العميل دون إجراء قدر كبير من أعمال إعادة العوملة.أعلم أنه كان حلاً مبتكرًا، لكنه كان الخيار الأفضل لدينا مع قاعدة الرموز القديمة الكبيرة هذه.والمكافأة الإضافية هي أنها تعمل بشكل جيد بشكل مدهش.:)

نصائح أخرى

آه، هذا يقتلني!لقد فعلت ذلك في العمل منذ حوالي 3 أشهر، والآن لا أستطيع تذكر كل التفاصيل.

ومع ذلك، أتذكر أنك تحتاج إلى basicHttpBinding، ولا يمكنك استخدام المُسلسل الجديد (وهو الإعداد الافتراضي)؛يجب عليك استخدام XmlSerializer "القديم".

لسوء الحظ، لا أعمل في المكان الذي قمت فيه بذلك بعد الآن، لذا لا يمكنني الذهاب لإلقاء نظرة على الكود.سأتصل برئيسي وأرى ما يمكنني استخراجه.

يجب عليك استخدام XmlSerializer.على سبيل المثال:

[ServiceContract(Namespace="CentreServiceNamespace")]
[XmlSerializerFormat(Style=OperationFormatStyle.Document, SupportFaults=true, Use=OperationFormatUse.Literal)]
public interface ICentreService {
    [OperationContract(Action="CentreServiceNamespace/MethodToReturnTrue")]
    bool MethodToReturnTrue(string seedValue);
}

يتعين عليك تعيين اسم إجراء العملية يدويًا لأن اسم WCF الذي تم إنشاؤه تلقائيًا تم إنشاؤه بشكل مختلف عن اسم إجراء ASMX (يتضمن WCF اسم الواجهة أيضًا، ولا يتضمن ASMX ذلك).

ينبغي تزيين أي عقود بيانات تستخدمها [XmlType] بدلا من [DataContract].

يجب ألا يحتاج ملف التكوين الخاص بك إلى التغيير.

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