2 Stimmen

svcutil Seifenfehler-Namensraumproblem

Ich generiere clientseitigen Webservice-Code mit svcutil. Der wsdl-Vertrag, den ich verwende, enthält einen Soap-Fehler. Wenn der Code generiert wird, scheint der Fehler in den Namespace verpackt zu werden, der im Vertrag definiert wurde.

Kann jemand erklären, warum?

Ich führe einfach svcutil [Dateiname]

Beispiel WSDL:

<wsdl:definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tm="http://microsoft.com/wsdl/mime/textMatching/" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:mime="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:tns="http://tempuri.org/" xmlns:s="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:http="http://schemas.xmlsoap.org/wsdl/http/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://tempuri.org/">
<wsdl:types>
    <s:schema elementFormDefault="qualified" targetNamespace="http://tempuri.org/">
        <s:element name="HelloFault">
            <s:complexType/>
        </s:element>
        <s:element name="HelloWorld">
            <s:complexType/>
        </s:element>
        <s:element name="HelloWorldResponse">
            <s:complexType>
                <s:sequence>
                    <s:element minOccurs="0" maxOccurs="1" name="HelloWorldResult" type="s:string"/>
                </s:sequence>
            </s:complexType>
        </s:element>
    </s:schema>
</wsdl:types>
<wsdl:message name="HelloWorldSoapIn">
    <wsdl:part name="parameters" element="tns:HelloWorld"/>
</wsdl:message>
<wsdl:message name="HelloWorldSoapOut">
    <wsdl:part name="parameters" element="tns:HelloWorldResponse"/>
</wsdl:message>
<wsdl:message name="NewMessage">
    <wsdl:part name="detail" element="tns:HelloFault"/>
</wsdl:message>
<wsdl:portType name="Service1Soap">
    <wsdl:operation name="HelloWorld">
        <wsdl:input message="tns:HelloWorldSoapIn"/>
        <wsdl:output message="tns:HelloWorldSoapOut"/>
        <wsdl:fault name="FaultName" message="tns:NewMessage"/>
    </wsdl:operation>
</wsdl:portType>
<wsdl:binding name="Service1Soap12" type="tns:Service1Soap">
    <soap12:binding transport="http://schemas.xmlsoap.org/soap/http"/>
    <wsdl:operation name="HelloWorld">
        <soap12:operation soapAction="http://tempuri.org/HelloWorld" soapActionRequired="" style="document"/>
        <wsdl:input>
            <soap12:body use="literal"/>
        </wsdl:input>
        <wsdl:output>
            <soap12:body use="literal"/>
        </wsdl:output>
        <wsdl:fault name="FaultName">
            <soap12:fault name="FaultName" use="literal"/>
        </wsdl:fault>
    </wsdl:operation>
</wsdl:binding>

Erzeugt:

namespace tempuri.org
{

using System.Runtime.Serialization;

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Runtime.Serialization", "3.0.0.0")]
[System.Runtime.Serialization.DataContractAttribute(Name="HelloFault", Namespace="http://tempuri.org/")]
public partial class HelloFault : object, System.Runtime.Serialization.IExtensibleDataObject
{

    private System.Runtime.Serialization.ExtensionDataObject extensionDataField;

    public System.Runtime.Serialization.ExtensionDataObject ExtensionData
    {
        get
        {
            return this.extensionDataField;
        }
        set
        {
            this.extensionDataField = value;
        }
    }
}

}

Aber andere im Vertrag deklarierte Typen werden ohne Namespace deklariert?

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")]
[System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
public partial class HelloWorldRequest
{
...

1voto

JohnIdol Punkte 46869

Sie müssen die /UseSerializerForFaults Attribut auf svcutil, wird dies dazu führen, dass der XmlSerializer für das Lesen und Schreiben von Fehlern (aber nur für diese) verwendet wird, anstelle des Standard DataContractSerializer (der immer noch für den Rest der Dinge verwendet wird).

Dies scheint ein echter Fehler zu sein - mehr Informationen auf meiner Blog-Beitrag .

0 Stimmen

Was, wenn /UseSerializerForFaults als nicht erkannte Option signalisiert wird?

0voto

tomasr Punkte 13533

Ich bin nicht sicher, ob ich verstehe, was das Problem ist... können Sie das klären?

So wie es aussieht, scheint WCF das Richtige zu tun... die generierte Klasse hat den richtigen Namespace-URI im Attribut [DataContract] gemäß dem Schema im gezeigten WSDL-Fragment.

Was haben Sie erwartet?

Aktualisierung: OK, ich verstehe, was Sie sagen, aber in diesem speziellen Fall ist es auch nicht unerwartet. Wenn Sie genau hinsehen, bemerken Sie, dass die andere Klasse, die Sie erwähnen (HelloWorldRequest), ein Message Contract ist, kein DataContract. Message Contracts haben selbst keine Namespaces, obwohl sie einen Namespace für das Wrapper-Element um den Message Body angeben können (siehe die WrapperNamespace Eigenschaft).

In Ihrem Fall gibt der Nachrichtenvertrag an, dass die Nachricht nicht verpackt ist, so dass der WrapperNamespace ohnehin nicht gelten würde.

Update #2: Was den CLR-Namespace (und nicht den XML-Namespace-URI) betrifft, so bietet SvcUtil eine Möglichkeit, diesen zu steuern; sehen Sie sich das Argument /namespace: in der Dokumentation .

0 Stimmen

Entschuldigung, ich wollte damit sagen, dass keiner der anderen Typen in dem Namespace ist, in dem sie deklariert wurden. Nur der Seifenfehler. Ich werde den Beitrag bearbeiten. Danke

0 Stimmen

Mir ist jetzt klar, dass ich mich nicht klar ausgedrückt habe. Ich bezog mich auf den C#-Namensraum und nicht auf den im DataContract definierten Namensraum.

0 Stimmen

Vielen Dank, ich wusste von dem Namensraumwechsel. (Ich habe nicht durch die Formulierung meiner Frage schlecht geholfen!) Wissen Sie, warum das Standardverhalten ist, die Fehler in einem CLR-Namensraum und nicht Nachrichten zu setzen? Scheint seltsam? insbesondere wenn Sie Fehler in Namespaces wie ' erhalten domain/name/2009/03/18 ' usw.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X