كيف يمكنك تكوين WCF لدعم FaultContracts حيث كل من المضيف والعميل وفي نفس العملية باستخدام net.pipe؟

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

سؤال

وأنا أحاول خلق اختبار وحدة في عملية خدمتي للتفاعلات العميل باستخدام net.pipe ملزمة. مثل خدمة WCF جيدة ويستخدم FaultContractAttribute على عمليات الخدمة لفضح العيوب المحتملة <م> (استثناءات ملفوفة) الفوقية. أود الحصول على نقاط النهاية العميل وخدمة تكوين من خلال XML <م> (App.config). ومع ذلك، كلما يتم طرح خطأ، انها مجرد CommunicationException "الأنابيب قد أغلقت"، وليس كتبته خطأ I أتوقع.

System.ServiceModel.CommunicationException: There was an error reading from the pipe: The pipe has been ended. (109, 0x6d). 

وحاولت إضافة IMetadataExchange نقطة النهاية لnet.pipe، ولكن ذلك لم ينجح. كما أنني حاولت. الذي يجري على ويندوز فيستا مطلوب مني أن NETSH دوري أبطال آسيا لنقطة النهاية HTTP. ذلك أيضا لم تنجح.

والطبقة استثناء مخصصة:

public class ValidationException : ApplicationException { }

وهذا هو أحدث محاولة في التكوين، لكنها تضخ <م> "لا يمكن العثور على اسم العقد" IMetadataExchange "في لائحة العقود المنفذة من قبل خدمة"

وسيكون موضع تقدير أي روابط لأمثلة أو توصيات حول كيفية تحقيق هذا.

<system.serviceModel>

  <client>
    <endpoint name="Client"
              contract="IService"
              address="net.pipe://localhost/ServiceTest/"
              binding="netNamedPipeBinding"
              bindingConfiguration="netPipeBindingConfig" />
  </client>

  <services>
    <service
      name="Service"
      behaviorConfiguration="ServiceFaults">
      <host>
        <baseAddresses>
          <add baseAddress="net.pipe://localhost/ServiceTest/"/>
          <add baseAddress="http://localhost/ServiceTest/"/>
        </baseAddresses>
      </host>
      <endpoint
        address=""
        binding="netNamedPipeBinding"
        bindingConfiguration="netPipeBindingConfig"

        name="ServicePipe"
        contract="IService" />
      <endpoint
        address="MEX"
        binding="mexNamedPipeBinding"
        bindingConfiguration="mexNetPipeBindingConfig"
        name="MexUserServicePipe"
        contract="IMetadataExchange" />
    </service>
  </services>

  <bindings>
    <netNamedPipeBinding>
      <binding name="netPipeBindingConfig"
               closeTimeout="00:30:00"
               sendTimeout="00:30:00" />
    </netNamedPipeBinding>
    <mexNamedPipeBinding>
      <binding name="mexNetPipeBindingConfig"></binding>
    </mexNamedPipeBinding>
  </bindings>

  <behaviors>
    <serviceBehaviors>
      <behavior name="ServiceFaults">
        <serviceDebug includeExceptionDetailInFaults="true"/>
      </behavior>
      <behavior name="MEX">
        <serviceMetadata 
          httpGetEnabled="true"
          httpGetUrl="http://localhost/ServiceTest/MEX"/>
      </behavior>
    </serviceBehaviors>
  </behaviors>

</system.serviceModel>

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

المحلول

إذا الطبقة ValidationException تصفون أعلاه هو للدرجة التي تستخدم للأخطاء، قد يكون مصدر المشكلة. يجب أن تستمد استثناءات خطأك من FaultException لأنه قابل للتسلسل. ApplicationException ليست كذلك.

واغنر هو الصحيح، تحتاج إلى تزيين تعريف العملية الخاصة بك مع سمة FaultContract يعطيها نوع من العقد. يجب عليك أيضا لتزيين FaultContract مع DataContract وDataMember سمات كذلك.

نصائح أخرى

وحصلت على نفس الخطأ قبل أيام قليلة.
I حلها خلق الطبقة بلدي (MyFault) ورمي FaultException من الخادم واصطياد هؤلاء في العميل. MyFault ديه اللي تبونه عضو سلسلة هو رسالة استثناء أريد العميل لنرى.

وأرجو أن أكون قدمت نفسي واضحة ... سأحاول أن ننظر لعينة لطيفة وأنا ما بعد هنا

والمشكلة هي على الأرجح على deserializing خطأ أو تسلسل الطلب أو استجابة. تمكين التتبع وعرض سجل مع svctraceviewer عن الخطأ بالضبط.

وبالإضافة إلى ذلك، تأكد من وضع علامة استثناء خطأك مع [DataContract] ولا يرث و[DataContract] الطبقات غير.

وشيء واحد آخر لإضافة. هل عقود التشغيل الخاص بك تحدد ServiceFault أنهم يستخدمون؟.

وما أفهمه هو أن لديك لتحديد أي ServiceFaults your're استخدام في طبقة العملية، والمنطق عملك رمي FaulException حيث T هو ServiceFault قمت بتعريفها.

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