0

まず、私の設定は次のとおりです。

  • .Net 4.0 ASP.Net アプリケーション
  • basicHttpBinding (soap 1.1) を使用した WCF サービス
  • 参照クラスは、オプション /useSerializerForFaults; を指定して svcutil を使用して生成されました。WSDL はすべての操作を定義し、types.xsd および types_fault.xsd ファイルへのリンクを提供します。参考までに、WSD ファイルと XSD ファイルは多くのアプリケーションで共通であるため、変更することはできません (もちろん、重大な検証エラーがない限り)。

SOAP エラーをクライアントに送信すると、問題が発生します。エラーの詳細について、コード内の正しいタイプにアクセスできないため、クライアントはこのエラーを処理できません。

以下は、理解を深めるための WSDL の抜粋です。

<wsdl:message name="CreateScheduledWorkRequest">
            <wsdl:part name="parameters" element="root:CreateScheduledWork"/>
    </wsdl:message>
    <wsdl:message name="CreateScheduledWorkResponse">
            <wsdl:part name="parameters" element="root:CreateScheduledWorkResponse"/>
    </wsdl:message>
    <wsdl:message name="CreateScheduledWorkFault">
            <wsdl:part name="parameters" element="root:CreateScheduledWorkFault"/>
    </wsdl:message>

<wsdl:portType name="ManageScheduledWorkScheduledWorkManagement">
<wsdl:operation name="CreateScheduledWork">
                    <wsdl:input name="CreateScheduledWorkRequest" message="intf:CreateScheduledWorkRequest"/>
                    <wsdl:output name="CreateScheduledWorkResponse" message="intf:CreateScheduledWorkResponse"/>
                    <wsdl:fault name="CreateScheduledWorkFault" message="intf:CreateScheduledWorkFault"/>
            </wsdl:operation>
</wsdl:portType>

<wsdl:binding name="ManageScheduledWorkScheduledWorkManagementBinding"   type="intf:ManageScheduledWorkScheduledWorkManagement">
            <wsdlsoap:binding style="document" transport="http://schemas.xmlsoap.org/soap/http"/>
            <wsdl:operation name="CreateScheduledWork">
                    <wsdlsoap:operation soapAction="http://www.orange.com/MACHX/Interfaces/ManageScheduledWork/ScheduledWorkManagement/v1/CreateScheduledWork"/>
                    <wsdl:input name="CreateScheduledWorkRequest">
                            <wsdlsoap:body use="literal"/>
                    </wsdl:input>
                    <wsdl:output name="CreateScheduledWorkResponse">
                            <wsdlsoap:body use="literal"/>
                    </wsdl:output>
                    <wsdl:fault name="CreateScheduledWorkFault">
                            <wsdlsoap:fault name="CreateScheduledWorkFault" use="literal"/>
                    </wsdl:fault>
            </wsdl:operation>
</wsdl:binding>

したがって、たとえば、Responseを返信する(エラーは発生していない) 場合、CreateScheduledWorkResponse要素を使用して正しく入力できます。しかし、FaultExceptionが発生した場合、CreateScheduledWorkFaultMessage を返すことしかできません ( CreateScheduledWorkFaultを返すことはできません)。そして、クライアントはこのタグを処理できません...

つまり、CreateScheduledWorkFault 型はコードで使用できません。

--> svcutil を使用して WSDL および XSD からコードを生成するときに、コード内の目的の型にアクセスできないため、何か問題があると思われます。

私はこのようにsvcutilを使用します:

svcutil /useSerializerForFaults CSW.wsdl CSW.xsd CSW_Fault.xsd

ご協力いただきありがとうございます。詳細が必要な場合は、お気軽にお問い合わせください。

ボリス

4

1 に答える 1

0

私の解決策は、生成されたクラスの型を直接変更することでした...それは悪いことですが、私の状況ではそれが唯一の選択肢でした (通常、WSDL は決して変更されないため、再生成するべきではありません)。

今、別の問題がありますが、名前空間に関連しているため、新しい質問を開きます。

于 2013-01-24T10:45:20.040 に答える