2012-05-01 32 views
21

Tôi đang xây dựng một dịch vụ web WCF yêu cầu interop với khách hàng không WCF (trên thực tế, sẽ không có khách hàng WCF).WCF SOAP 1.2 dịch vụ mong đợi SOAP 1.1 loại nội dung

Tôi đã viết WSDL bằng SOAP 1.2 (as per this example). Tôi đã xác nhận WSDL và đã sử dụng tệp này (không phải WSDL do WCF tạo ra, khác biệt bề ngoài) để tạo một dự án thử nghiệm soapUI.

Tôi có yêu cầu dịch vụ web sẽ hỗ trợ SOAP 1.2, vì vậy tôi không thể quay trở lại SOAP 1.1 (đã hoạt động tốt trong bản mẫu đầu).

Tôi đã sử dụng WSCF.blue để tạo các dịch vụ WCF, giao diện và các lớp hợp đồng dữ liệu của mình. Tất cả mọi thứ biên dịch độc đáo và điểm cuối được tiếp xúc nếu tôi nhấn dịch vụ WCF trong trình duyệt của tôi. Tất cả dường như tốt với thế giới.

Khi tôi cố gắng gọi một phương thức từ soapUI tôi nhận được sau phản hồi từ máy chủ (như nhìn thấy từ soapUI):

HTTP/1.1 415 Cannot process the message because the content type 
'application/soap+xml;charset=UTF-8;action="http://tempuri.org/FetchMyThing"' 
was not the expected type 'text/xml; charset=utf-8'. 
Server: Microsoft-IIS/7.5 
X-Powered-By: ASP.NET 
Date: Mon, 30 Apr 2012 08:15:29 GMT 
Content-Length: 0 

(phương pháp thực tế tên và không gian tên đã được thay đổi bằng tay cho các mục đích này câu hỏi. Bất kỳ lỗi chính tả nào trong không gian tên không phải là lỗi trong mã của tôi - chỉ cần giám sát khi nhập câu hỏi này)

Tôi biết rằng SOAP 1.1 chỉ định rằng loại nội dung phải là văn bản/xml. SOAP 1.2 yêu cầu ứng dụng/xà phòng + xml.

yêu cầu nguyên liệu của tôi (theo soapUI):

POST http://localhost/MyWs.svc HTTP/1.1 
Accept-Encoding: gzip,deflate 
Content-Type: application/soap+xml;charset=UTF-8;action="http://tempuri.org/FetchMyThing" 

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" 
       xmlns:ns="http://tempuri.org"> 
    <soap:Header/> 
    <soap:Body> 
     <ns:fetchMyThingRequest attribute1="1" attribute2="10"> 
     </ns:fetchMyThingRequest> 
    </soap:Body> 
</soap:Envelope> 

Từ phản ứng này, nó nói với tôi rằng yêu cầu của tôi được hình thành đúng - đó là một SOAP 1.2 yêu cầu với các loại nội dung chính xác. Dịch vụ WCF của tôi, tuy nhiên, không mong đợi loại nội dung này, mà tôi giả định có nghĩa là tôi đã không cấu hình nó một cách chính xác và nó vẫn nghĩ rằng đó là một dịch vụ web SOAP 1.1.

Web.config tối thiểu, theo this blog post:

<system.serviceModel> 
    <services> 
    <service name="MyNamespace.MyPort"> 
     <endpoint address="" binding="customBinding" bindingConfiguration="httpSoap12" contract="IWsPort12" /> 
    </service> 
    </services> 

    <bindings> 
    <customBinding> 
     <binding name="httpSoap12"> 
     <textMessageEncoding messageVersion="Soap12" /> 
     <httpTransport /> 
     </binding> 
    </customBinding> 
    </bindings> 
</system.serviceModel> 

Một đoạn của hợp đồng dịch vụ:

[ServiceContract(Namespace = "http://tempuri.org")] 
public interface IWsPort 
{ 
    [OperationContract(Action = "http://tempuri.org/FetchMyThing")] 
    [FaultContract(typeof(WsFault), Action = "http://tempuri.org/FetchMyThing", Name = "fetchMyThingFault")] 
    [XmlSerializerFormat(SupportFaults = true)] 
    FetchMyThingResponse FetchMyThing(FetchMyThingRequest request); 
} 

tôi kích hoạt dịch vụ truy tìm cho dịch vụ WCF của tôi và xem những ngoại lệ sau đây mà dường như xác nhận giả thuyết của tôi:

Activity: Listen at 'http://mycomputer/MyWs.svc 
<Exception> 
    <ExceptionType>System.ServiceModel.ProtocolException, System.ServiceModel, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType> 
    <Message>Content Type application/soap+xml;charset=UTF-8;action="http://tempuri.org/FetchMyThing" was sent to a service expecting text/xml; charset=utf-8. The client and service bindings may be mismatched. 
    </Message> 
(erroneous detail snipped) 
</Exception> 

Vì vậy, hợp đồng và dịch vụ của tôi bind bind có lẽ không phù hợp, nếu thông điệp này là để tin, nhưng từ những gì tôi hiểu về WCF cấu hình của tôi (hoặc ít nhất là ý định đằng sau nó) là chính xác.

Có ai có bất kỳ ý tưởng nào về cấu hình của tôi có vấn đề gì không?

Trả lời

9

Điều duy nhất tôi có thể nghĩ rằng đó là vì bạn đã không chỉ định một ràng buộc trong rất nhiều chi tiết, và sử dụng HTTP của nó (theo điều này: "Nghe tại 'http://mycomputer/MyWs.svc'") sau đó là nó bằng cách sử dụng mặc định (tức là basicHttpBinding) cho điều này, điều này tạo ra sự không phù hợp?

+3

Có! Điều này đã kết thúc là vấn đề - một sự không khớp trong thuộc tính name được chỉ định trong tệp .svc của tôi (đánh dấu) và tên dịch vụ trong web.config của tôi. Tôi đã nhìn thấy ngoại lệ thời gian chạy vì cấu hình của tôi đôi khi không hợp lệ - nhưng điều đó không có nghĩa là nó đã thực sự được ánh xạ tới cấu hình! –

1

Tôi gặp vấn đề tương tự khi tôi có nhiều liên kết trên dịch vụ của mình. Khi tôi gỡ bỏ tất cả các ràng buộc và chỉ để lại một ràng buộc chưa đặt tên tại chỗ, thông báo lỗi biến mất.

0

Vui lòng kiểm tra liên kết này How to: Configure WCF Service to Interoperate with ASP.NET Web Service Clients .

Để cấu hình Windows Communication Foundation (WCF) dịch vụ thiết bị đầu cuối là tương thích với ASP.NET khách hàng dịch vụ Web, sử dụng System.ServiceModel. BasicHttpBinding nhập làm loại ràng buộc cho điểm cuối dịch vụ của bạn.

Ngoài ra, việc xác định hai điểm đầu cuối, bạn có thể sử dụng HTTP và HTTPS phiên bản của cùng một dịch vụ

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