WCF で WSDL からコードを生成すると、デフォルト値と一致しないメッセージが返され続ける

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

質問

わかりました、これは私を狂わせています。事前定義された wsdl からサービス実装コードを構築しようとしていますが、サービス コントラクト/インターフェイスで一貫してメッセージを返しています。

// CODEGEN: Generating message contract since the wrapper name (GetMetricsRequest) of message GetMetricsRequest does not match the default value (GetMetrics)

    [System.ServiceModel.OperationContractAttribute(Action="GetMetrics", ReplyAction="*")]
    [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
    GetMetricsResponse GetMetrics(GetMetricsRequest request);

svcutil.exe と WSCF のサービス コード生成ウィザードを使用してこれを実行しようとしましたが、どちらも同じ結果を返しました。

以下は私が使用しているWSDLです。ここにタイプを追加しましたが、それらを別の xsd に分割しましたが、両方を投稿したくなかっただけです。この wsdl (すべての型が埋め込まれた状態) を使用すると、同じ問題が発生します。

このブログ投稿を確認しました(http://pzf.fremantle.org/2007/05/handlign.html)、この問題に関して私が見つけられたのはこれだけです。やるべきことはすべてやったと思いますが、まだ問題があります。

他にこれに遭遇した人はいますか?それは非常に腹立たしいです、おそらく私は明らかな何かを見逃しています。ご協力をよろしくお願いいたします。

<wsdl:definitions
xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" 
 xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
 xmlns:xs="http://www.w3.org/2001/XMLSchema"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema"
 xmlns:tns="urn:MyNameSpace:V1_0"        


 targetNamespace="urn:MyNameSpace:V1_0">


 <wsdl:types>
  <xs:schema targetNamespace="urn:MyNameSpace:V1_0">
   <xs:element name="GetMetricsRequest">
    <xs:complexType>
     <xs:sequence>
      <xs:element  nillable="true" name="GetMetricRequestElement" type="tns:GetMetricRequestType"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>   
   <xs:element name="GetMetricResponse">
    <xs:complexType>
     <xs:sequence>
      <xs:element  nillable="true" maxOccurs="unbounded" name="GetMetricResponseElement" type="tns:GetMetricResponseType"/>
     </xs:sequence>
    </xs:complexType>
   </xs:element>

   <xs:complexType name="GetMetricResponseType">
    <xs:sequence>
     <xs:element  nillable="true" name="Metrics" type="tns:MetricsType"/>
    </xs:sequence>
   </xs:complexType>

   <xs:complexType name="GetMetricRequestType">
    <xs:sequence>
     <xs:element  minOccurs="1" maxOccurs="1" name="MetricCriteria" nillable="true" type="tns:MetricCriteriaType"/>
    </xs:sequence>
   </xs:complexType>

   <xs:simpleType name="AvailableMetricType"> 
    <xs:restriction base="xs:string">
     <xs:enumeration value="MetricType1"/>
     <xs:enumeration value="MetricType2"/>
     <xs:enumeration value="MetricType3"/>
     <xs:enumeration value="MetricType4"/>
    </xs:restriction>
   </xs:simpleType>

   <xs:complexType name="AvailableMetricsType">
    <xs:sequence>
     <xs:element minOccurs="1" nillable="true" maxOccurs="unbounded" name="MetricType" type="tns:AvailableMetricType"/>
    </xs:sequence>
   </xs:complexType>

   <xs:simpleType name="MetricDimensionType">
    <xs:restriction base="xs:string">
     <xs:enumeration value="Store"/>
     <xs:enumeration value="Workgroup"/>
     <xs:enumeration value="BusinessDate"/>
     <xs:enumeration value="JobClass"/>
    </xs:restriction>
   </xs:simpleType>

   <xs:complexType name="MetricDimensionsType">
    <xs:sequence>
     <xs:element minOccurs="1" maxOccurs="unbounded"  nillable="true" name="MetricDimension" type="tns:MetricDimensionType"/>
    </xs:sequence>
   </xs:complexType>    

   <xs:complexType name="MetricCriteriaType">
    <xs:sequence>
     <xs:element minOccurs="0" maxOccurs="1" name="storeNumber" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" maxOccurs="1" name="workgroup" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" maxOccurs="1" name="jobClass" nillable="true" type="xs:string"/>
     <xs:element maxOccurs="1" nillable="true" name="dateStart" type="xs:dateTime"/>
     <xs:element maxOccurs="1" nillable="true" name="dateEnd" type="xs:dateTime"/>
     <xs:element maxOccurs="1" name="dimensions" nillable="true" type="tns:MetricDimensionsType"/>
     <xs:element maxOccurs="1" name="metricTypes" nillable="true" type="tns:AvailableMetricsType"/>
    </xs:sequence>
   </xs:complexType>

   <xs:complexType name="MetricType">
    <xs:sequence>
     <xs:element minOccurs="0" maxOccurs="1" name="businessDate"  nillable="true" type="xs:dateTime"/>
     <xs:element minOccurs="0" maxOccurs="1" name="store" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" maxOccurs="1" name="workgroup" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" maxOccurs="1" name="jobClass" nillable="true" type="xs:string"/>
     <xs:element minOccurs="0" maxOccurs="1" name="metricValue"  nillable="true" type="xs:decimal"/>     
    </xs:sequence>
   </xs:complexType>

   <xs:complexType name="MetricsType">
    <xs:sequence>
     <xs:element minOccurs="0" maxOccurs="unbounded" name="Metric" nillable="true" type="tns:MetricType"/>
    </xs:sequence>
   </xs:complexType>

  </xs:schema>
 </wsdl:types>

 <wsdl:message name="GetMetricsRequestMessage">
  <wsdl:part name="parameters" element="tns:GetMetricsRequest"/>
 </wsdl:message>

 <wsdl:message name="GetMetricsResponseMessage">
  <wsdl:part name="parameters" element="tns:GetMetricResponse"/>
 </wsdl:message>

 <wsdl:portType name="Metric">
  <wsdl:operation name="GetMetrics">
   <wsdl:input message="tns:GetMetricsRequestMessage"/>
   <wsdl:output message="tns:GetMetricsResponseMessage"/>
  </wsdl:operation>
 </wsdl:portType>

 <wsdl:binding name="MetricService" type="tns:Metric">
  <soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
  <wsdl:operation name="GetMetrics">
   <soap:operation soapAction="GetMetrics" style="document"/>
   <wsdl:input>
    <soap:body use="literal"/>    
   </wsdl:input>
   <wsdl:output>
    <soap:body use="literal"/>
   </wsdl:output>
  </wsdl:operation>
 </wsdl:binding>

 <wsdl:service name="Metric">
  <wsdl:port name="GetMetrics" binding="tns:MetricService">
   <soap:address location="http://myurl/myproj/1.0/MyService.svc"/>
  </wsdl:port>
 </wsdl:service>

</wsdl:definitions>

ありがとう、marc_s

よし、うまくいったようだ。応答タイプに「」が欠けているだけでした。やあ!

サービス コードは正常に生成されているように見えますが、サービスを参照するとデータ コントラクト/xsd がなく、wsdl に対する操作がありません。

それは次のようになります:

<wsdl:definitions name="MetricServiceImplementation" targetNamespace="http://tempuri.org/">
  <wsdl:import namespace="urn:GiantEagle:Services:Systems::Metric:V1_0" location="http://localhost:2814/Services/MetricService.svc?wsdl=wsdl0"/>
  <wsdl:types/>
    <wsdl:binding name="BasicHttpBinding_MetricService" type="i0:MetricService">
      <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/>
  </wsdl:binding>
  <wsdl:service name="MetricServiceImplementation">
    <wsdl:port name="BasicHttpBinding_MetricService" binding="tns:BasicHttpBinding_MetricService">
      <soap:address location="http://localhost:2814/Services/MetricService.svc"/>
    </wsdl:port>
  </wsdl:service>
</wsdl:definitions>

コードを生成した wsdl と同じように見えると思いますが、違いますか?

正しい解決策はありません

他のヒント

これを試してみてください。WSDL のリクエストおよびレスポンス メッセージは次のようになります。

  • リクエストのオペレーションと同じ名前 (「GetMetrics」)
  • オペレーションの名前 + 応答の「Response」 (「GetMetricsResponse」)

したがって、WSDL を次のように変更してみてください。

<wsdl:message name="GetMetrics">
   <wsdl:part name="parameters" element="tns:GetMetricsRequest"/>
</wsdl:message>

<wsdl:message name="GetMetricsResponse">
   <wsdl:part name="parameters" element="tns:GetMetricResponse"/>
</wsdl:message>

portType も更新します。

<wsdl:portType name="Metric">
   <wsdl:operation name="GetMetrics">
      <wsdl:input message="tns:GetMetrics"/>
      <wsdl:output message="tns:GetMetricsResponse"/>
   </wsdl:operation>
</wsdl:portType>

それは少しでも役に立ちますか?

そうでない場合:実際のを更新してみてください <xs:element> XSD 内で同じパターンに一致するようにする必要があります。要求の種類は呼び出している操作と同じである必要があり、応答オブジェクトは (MethodName)Response である必要があります。

"*"ReplyAction("*")OperationContractを削除する

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top