2012-10-10 30 views
12

tôi đang học WCF, cụ thể tôi đang học làm thế nào để viết chúng hợp đồng đầu tiên, ala wscf.blueTại sao tôi nhận được ActionNotSupportedException cho khách hàng/dịch vụ WCF của tôi?

tôi có thể tạo ra một khách hàng WCF/dịch vụ hợp đồng Cách cuối cùng (Microsoft) tôi có thể tạo ra một khách hàng WCF/dịch vụ cách hợp đồng đầu tiên (WSCF)

Nhưng, nếu tôi tạo một dịch vụ hợp đồng đầu tiên, hãy thử thêm nó theo cách của Microsoft (Tham khảo dịch vụ) thay vì cách WSCF.blue (chia sẻ hợp đồng và tạo khách hàng). t làm việc.

Nó ném một ActionNotSupportedException với thông điệp The message with Action 'urn:test-com:simple:testMethodIn' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None).

Và tôi không có ý tưởng gì đó có nghĩa.

Đây là hợp đồng thử nghiệm của tôi:

SimpleModel.xsd

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns="urn:test-com:simple" xmlns:mstns="urn:test-com:simple" xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:test-com:simple" elementFormDefault="qualified" attributeFormDefault="unqualified" id="SimpleModel"> 
    <xs:complexType name="PayloadType"> 
     <xs:sequence> 
      <xs:element name="AString" type="xs:string" nillable="1" minOccurs="0"/> 
      <xs:element name="AnInt" type="xs:int"/> 
     </xs:sequence> 
    </xs:complexType> 
</xs:schema> 

SimpleMessages.xsd

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns="urn:test-com:simple" xmlns:mstns="urn:test-com:simple" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:smod="http://tempuri.org/SimpleModel.xsd" targetNamespace="urn:test-com:simple" elementFormDefault="qualified" attributeFormDefault="unqualified" id="SimpleMessages"> 
    <xs:include schemaLocation="SimpleModel.xsd"/> 
    <xs:element name="TestMethod"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="APayload" type="PayloadType" minOccurs="0"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    <xs:element name="TestMethodResponse"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="Output" type="PayloadType"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

Simple.wsdl

<!--WSDL generated by thinktecture WSCF; version 1.0.13.0--> 
<!--Tuesday, 09-10-2012 - 02:41 PM--> 
<definitions xmlns:tns="urn:test-com:simple" xmlns:soap12="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" name="Simple" targetNamespace="urn:test-com:simple"> 
    <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 
    <types> 
     <xsd:schema> 
      <xsd:import schemaLocation="SimpleMessages.xsd" namespace="urn:test-com:simple"/> 
     </xsd:schema> 
    </types> 
    <message name="testMethodIn"> 
     <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 
     <part name="parameters" element="tns:TestMethod"/> 
    </message> 
    <message name="testMethodOut"> 
     <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 
     <part name="parameters" element="tns:TestMethodResponse"/> 
    </message> 
    <portType name="SimpleInterface"> 
     <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 
     <operation name="TestMethod"> 
      <wsdl:documentation xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"/> 
      <input message="tns:testMethodIn"/> 
      <output message="tns:testMethodOut"/> 
     </operation> 
    </portType> 
    <binding name="BasicHttpBinding_SimpleInterface" type="tns:SimpleInterface"> 
     <soap:binding transport="http://schemas.xmlsoap.org/soap/http"/> 
     <operation name="TestMethod"> 
      <soap:operation soapAction="urn:test-com:simple:testMethodIn" style="document"/> 
      <input> 
       <soap:body use="literal"/> 
      </input> 
      <output> 
       <soap:body use="literal"/> 
      </output> 
     </operation> 
    </binding> 
    <service name="ISimple"> 
     <port name="NewPort" binding="tns:BasicHttpBinding_SimpleInterface"> 
      <soap:address location="http://localhost:50862/Simple.svc"/> 
     </port> 
    </service> 
</definitions> 

Dưới đây là phần System.ServiceModel fro m web.config

<system.serviceModel> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="SimpleServiceBehaviour"> 
       <serviceMetadata externalMetadataLocation="http://localhost:50862/TestContract/Simple.wsdl" httpGetEnabled="true"/> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
    <diagnostics> 
     <messageLogging logMalformedMessages="true" logMessagesAtTransportLevel="true"/> 
    </diagnostics> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_SimpleInterface" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/> 
       <security mode="None"> 
        <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
        <message clientCredentialType="UserName" algorithmSuite="Default"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
    <services> 
     <service behaviorConfiguration="SimpleServiceBehaviour" name="SimpleContract.Simple"> 
      <endpoint address="http://localhost:50862/Simple.svc" behaviorConfiguration="" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_SimpleInterface" contract="ISimple"/> 
     </service> 
    </services> 
</system.serviceModel> 

Nếu tôi thêm tham chiếu dịch vụ vào http://localhost:50862/Simple.svc Mọi xuất hiện để tạo OK.

tôi tạo này trong app.config khách hàng sử dụng các dịch vụ biên tập cấu hình bằng cách nhập web.config:

<system.serviceModel> 
    <client> 
     <endpoint address="http://localhost:50862/Simple.svc" binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_SimpleInterface" contract="SI.SimpleInterface" name="NewPort"/> 
    </client> 
    <bindings> 
     <basicHttpBinding> 
      <binding name="BasicHttpBinding_SimpleInterface" closeTimeout="00:01:00" openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00" allowCookies="false" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard" maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536" messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered" useDefaultWebProxy="true"> 
       <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384" maxBytesPerRead="4096" maxNameTableCharCount="16384"/> 
       <security mode="None"> 
        <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
        <message clientCredentialType="UserName" algorithmSuite="Default"/> 
       </security> 
      </binding> 
     </basicHttpBinding> 
    </bindings> 
</system.serviceModel> 

Và nếu tôi chạy mã thử nghiệm của tôi:

static void Main(string[] args) 
{ 
    SimpleInterfaceClient client = new SimpleInterfaceClient(); 

    var ret = client.TestMethod(new PayloadType() { AnInt = 7, AString = "bob" }); 

    Console.WriteLine(ret.ToString()); 
    Console.ReadLine(); 
} 

Bên trong TestMethod proxy dòng sau:

return base.Channel.TestMethod(request); 

Ném ngoại lệ sau

System.ServiceModel.ActionNotSupportedException occurred 
    Message="The message with Action 'urn:test-com:simple:testMethodIn' cannot be processed at the receiver, due to a ContractFilter mismatch at the EndpointDispatcher. This may be because of either a contract mismatch (mismatched Actions between sender and receiver) or a binding/security mismatch between the sender and the receiver. Check that sender and receiver have the same contract and the same binding (including security requirements, e.g. Message, Transport, None)." 
    Source="System.ServiceModel" 
    StackTrace: 
     at System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(Message reply, MessageFault fault, String action, MessageVersion version, FaultConverter faultConverter) 

Ai cũng có thể trợ giúp?

Cảm ơn,

J.

Đầu Sửa

OK, bây giờ tôi đã phát hiện ra rằng có cái gì đó đi sai với wsdl doc-lit-bọc tôi và các máy phát điện mã. wscf.blue không thích thư của nó để có các kiểu nullable được đánh dấu là không thể. Nó rơi ra khỏi chế độ được bao bọc và việc triển khai phương thức không được mở.

Nhưng, nếu tôi không đánh dấu chúng là không thể, mã khách hàng sẽ rơi ra khỏi chế độ gói vì chúng là các loại không có giá trị không được đánh dấu là không thể.

Với loại nullable đánh dấu không nillable:

Server side:

[System.ServiceModel.OperationContractAttribute(Action="urn:test-com:simple/ISimple/TestMethod", ReplyAction="urn:test-com:simple/ISimple/TestMethodResponse")] 
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)] 
[return: System.ServiceModel.MessageParameterAttribute(Name="Output")] 
PayloadType TestMethod(PayloadType APayload); 

Client Side:

// CODEGEN: Generating message contract since element name APayload from namespace urn:test-com:simple is not marked nillable 
[System.ServiceModel.OperationContractAttribute(Action="urn:test-com:simple:testMethodIn", ReplyAction="*")] 
DesktopClientTest_ServiceReference.SI.TestMethodResponse TestMethod(DesktopClientTest_ServiceReference.SI.TestMethodRequest request); 

Với loại nullable đánh dấu là nillable:

Server side:

// CODEGEN: Parameter 'Output' requires additional schema information that cannot be captured using the parameter mode. The specific attribute is 'System.Xml.Serialization.XmlElementAttribute'. 
[System.ServiceModel.OperationContractAttribute(Action="urn:test-com:simple/ISimple/TestMethod", ReplyAction="urn:test-com:simple/ISimple/TestMethodResponse")] 
[System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)] 
[return: System.ServiceModel.MessageParameterAttribute(Name="Output")] 
TestMethodResponse TestMethod(TestMethodRequest request); 

Khách hàng bên:

[System.ServiceModel.OperationContractAttribute(Action="urn:test-com:simple:testMethodIn", ReplyAction="*")] 
[return: System.ServiceModel.MessageParameterAttribute(Name="Output")] 
DesktopClientTest_ServiceReference.SI.PayloadType TestMethod(DesktopClientTest_ServiceReference.SI.PayloadType APayload); 

Tuy nhiên tôi không có ý tưởng cho dù đó là nguyên nhân, hãy để một mình làm thế nào để sửa chữa nó. Điều đó nói rằng, tôi làm biết rằng các loại nullable phải được đánh dấu là không có khả năng cho wsdl được nhúng tài liệu.

Trả lời

1

Tôi nghĩ vấn đề là hợp đồng. Trong client được tạo, bạn có thể thấy contract = "SI.SimpleInterface", nhưng trong hợp đồng định nghĩa dịch vụ = "ISimple".

Các vấn đề liên quan