ممكن أن تستهلك تشكيل غير صالح رسائل خطأ؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

ولقد عميل WCF التواصل مع تنفيذ ملقم غير معروف التي ليست لدي السيطرة عليها. هذا العميل يعمل بشكل جيد فقط لا تريد، على ما يبدو، رسائل خطأ SOAP شكلت بشكل غير صحيح. الرسائل تصلني تبدو مثل:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">   
    <soap:Header>...</soap:Header>  
    <soap:Body>  
        <soap:Fault>  
            <soap:faultcode>soap:Client</soap:faultcode>  
            <soap:faultstring>...</soap:faultstring>  
            <soap:detail>...</soap:detail>  
        </soap:Fault>  
    </soap:Body>  
</soap:Envelope>  

وأعتقد وفقا لمخطط الصابون العناصر التابعة يجب أن لا تكون مؤهلة ونيد لتبدو وكأنها:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">   
    <soap:Header>...</soap:Header>  
    <soap:Body>  
        <soap:Fault>  
            <faultcode>soap:Client</faultcode>  
            <faultstring>...</faultstring>  
            <detail>...</detail>  
        </soap:Fault>  
    </soap:Body> 
</soap:Envelope>

هل هناك شيء أستطيع أن تكوين أو تجاوز لدرجة أنني يمكن أن تستهلك الرسائل التي تصل في شكل الأخير حتى أستطيع أن تستهلك رسائل خطأ بدلا من الاستثناءات أكس؟

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

المحلول

وأنا لا أذكر كيف وجدت بالصدفة المفتشون رسالة، ولكن ذلك كيف تحل مشكلتي.

هذا و <لأ href = "HTTP: // blogs.msdn.com/kaevans/archive/2008/01/08/modify-message-content-with-wcf.aspx "يختلط =" نوفولو noreferrer "> قدمت هذه المقالة قاعدة لخلق المفتش، و ما يلي هو لحم مفتش:

public void AfterReceiveReply(ref Message reply, object correlationState)
{
    if (!reply.IsFault)
        return;

    var document = new XmlDocument();

    document.Load(reply.GetReaderAtBodyContents());

    var navigator = document.CreateNavigator();
    var manager = new XmlNamespaceManager(navigator.NameTable);

    manager.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");

    var it = navigator.Select("//soap:Fault", manager);

    if (it.MoveNext() && it.Current.HasChildren && it.Current.MoveToChild(XPathNodeType.Element))
    {
        do
        {
            var c = it.Current;

            if (string.IsNullOrEmpty(c.Prefix))
                continue;

            c.ReplaceSelf("<" + c.LocalName + ">" + c.InnerXml + "</" + c.LocalName + ">");

            /// we may want to record the detail included inside the detail element, 
            /// it is not reported in the FaultException that is raised.

        } while (it.Current.MoveToNext());
    }

    var reader = XmlDictionaryReader.CreateDictionaryReader(new XmlNodeReader(document));

    reader.MoveToStartElement();

    var fixedReply = Message.CreateMessage(reply.Version, null, reader);

    fixedReply.Headers.CopyHeadersFrom(reply.Headers);
    fixedReply.Properties.CopyProperties(reply.Properties);

    reply = fixedReply;
}

نصائح أخرى

ويبدو أن التطبيق المخالف يستخدم عادة (وتنفيذها بشكل سيئ) مكتبة SOAP. المقالة التالية قد تساعد (لم تتح لي للتعامل مع هذا اعتبارا من بعد وأنا في متجر صافي نقي).

http://msdn.microsoft.com/en-us/library /ms733721.aspx

ملاحظة أن الطبقة System.Web.Services.Protocols.SoapHttpClientProtocol يبدو <م> إلى حد كبير أكثر تسامحا من الاستجابات خطأ تالف من WCF.

ويشار إلى ذلك أحيانا بروتوكول خدمات ASMX. وهذا قد يكون خيارا للنظر أيضا.

وهوارد هوفمان

} catch (SoapFaultClientException e) {
    log.error(e);
    SoapFaultDetail soapFaultDetail = e.getSoapFault().getFaultDetail();
    SoapFaultDetailElement detailElementChild = (SoapFaultDetailElement) soapFaultDetail.getDetailEntries().next();
    Source detailSource = detailElementChild.getSource();

    try {
        Object detail = (JAXBElement<SearchResponse>) getWebServiceTemplate().getUnmarshaller().unmarshal(detailSource);
//                throw new SoapFaultWithDetailException(detail);

    } catch (IOException e1) {
        throw new IllegalArgumentException("cannot unmarshal SOAP fault detail object: " + soapFaultDetail.getSource());
    }

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