7

好吧,这让我发疯了。我一直在尝试从预定义的 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,

好的,这似乎有效。它只是响应类型中缺少的“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,不是吗?

4

2 回答 2

5

试试这个 - 您在 WSDL 中的请求和响应消息应该是

  • 与您的请求操作同名(“GetMetrics”)
  • 操作的名称 + 您的响应的“响应”(“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>

并更新您的端口类型:

<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 。

于 2010-01-30T09:27:47.263 回答
3

删除"*"ReplyAction("*")OperationContract

于 2010-09-09T05:00:35.680 回答