لا يتطابق توليد الرمز من WSDL في WCF
-
24-09-2019 - |
سؤال
حسنًا ، هذا يقودني إلى الجنون. لقد كنت أحاول إنشاء رمز تنفيذ الخدمة من 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")
- اسم العملية + "الاستجابة" لاستجابتك ("getMetricsPonse")
لذا حاول تغيير 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) استجابة.
مسح ال "*"
في ال ReplyAction("*")
التابع OperationContract