2011-01-05 35 views
8

Tôi đang cố gắng có SOAP và RESTful trong cùng một dịch vụ WCF. Tôi cũng đã trải qua nó ngoài một vấn đề. Sau đây là web.config của tôi:SOAP, JSON và POX trong cùng một wcf an toàn

<service behaviorConfiguration="webBehaviour" name="MyServices"> 
     <clear /> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttp" 
     name="basicHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="ws" binding="wsHttpBinding" bindingConfiguration="WsHttp" 
      name="wsHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="web" binding="webHttpBinding" bindingConfiguration="WebHttp" behaviorConfiguration="webBehavior" 
      name="webHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="json" binding="webHttpBinding" bindingConfiguration="WebHttp" behaviorConfiguration="webJSONBehavior" 
      name="webJSONHttpBinding" contract="DJSharedServices.ISharedServices" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" name="mexBinding" />   
     </service>  
    </services> 

Khi tôi có tất cả các thiết bị đầu cuối nó mang lại cho các lỗi sau:

An ExceptionDetail, likely created by IncludeExceptionDetailInFaults=true, whose value is: 
System.NullReferenceException: Object reference not set to an instance of an object. 
    at System.ServiceModel.Description.WsdlExporter.CreateWsdlBindingAndPort(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName, Port& wsdlPort, Boolean& newBinding, Boolean& bindingNameWasUniquified) 
    at System.ServiceModel.Description.WsdlExporter.ExportEndpoint(ServiceEndpoint endpoint, XmlQualifiedName wsdlServiceQName) 
    at System.ServiceModel.Description.WsdlExporter.ExportEndpoints(IEnumerable`1 endpoints, XmlQualifiedName wsdlServiceQName) 
    at System.ServiceModel.Description.ServiceMetadataBehavior.MetadataExtensionInitializer.GenerateMetadata() 
    at System.ServiceModel.Description.ServiceMetadataExtension.EnsureInitialized() 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.InitializationData.InitializeFrom(ServiceMetadataExtension extension) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.GetInitData() 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.TryHandleDocumentationRequest(Message httpGetRequest, String[] queries, Message& replyMessage) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.ProcessHttpRequest(Message httpGetRequest) 
    at System.ServiceModel.Description.ServiceMetadataExtension.HttpGetImpl.Get(Message message) 
    at SyncInvokeGet(Object , Object[] , Object[]) 
    at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) 
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet) 

Mọi thứ hoạt động tốt nếu tôi nhận xét ra điểm json kết thúc.

Bạn có thể vui lòng giúp tôi tìm hiểu lý do không ??

Xin cảm ơn trước.

Trả lời

12

Tôi vừa thêm thay đổi cấu hình ràng buộc cho hành vi json. Tôi đã sử dụng cùng một cấu hình binging cho JSON và POX. Bây giờ tôi đã thay đổi cấu hình để:

<service behaviorConfiguration="WebBehaviour" name="MyServices"> 
     <clear /> 
     <endpoint address="" binding="basicHttpBinding" bindingConfiguration="basicHttp" 
     name="basicHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="ws" binding="wsHttpBinding" bindingConfiguration="WsHttp" 
      name="wsHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="web" binding="webHttpBinding" bindingConfiguration="WebHttp" behaviorConfiguration="webBehavior" 
      name="webHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="json" binding="webHttpBinding" bindingConfiguration="WebjsonHttp" behaviorConfiguration="webJSONBehavior" 
      name="webJSONHttpBinding" contract="DJSharedServices.IMyServices" /> 
     <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" name="mexBinding" />   
     </service> 

và thêm cấu hình ràng buộc:

<webHttpBinding> 
     <binding name="WebHttp" > 
      <security mode="None"></security> 
     </binding> 

     <binding name="WebjsonHttp" > 
      <security mode="None"></security> 
     </binding> 
     </webHttpBinding> 
+0

Bất kỳ ý tưởng nào tại sao hai điểm cuối không thể chia sẻ một ràng buộc cho wsdl để hoạt động? – JeremyWeir

+0

@Jayrdub Tôi nghĩ vì nó cần địa chỉ khác nhau và địa chỉ khác nhau cần proxy khác nhau. – genericuser

+0

yea và không có chức năng hộp với WCF như có với WebAPI, nơi nó sẽ cho phép bạn giữ cho các URL của bạn sạch hơn bằng cách lấy địa chỉ = "json", address = "xml" yada yada. WebApi xem xét loại nội dung của bạn và con số đó ra trên riêng của mình mà là một tiết kiệm thời gian tốt đẹp trong mã trên các dịch vụ và cấu hình của bạn. – PositiveGuy

2

Làm cho mình một đặc ân và ngừng cố gắng để tạo ra một dịch vụ mà hiện cả hai SOAP và REST. Bạn sẽ kết thúc với một mớ hỗn độn. Xem xét các yêu cầu của bạn và chọn cách tiếp cận này phù hợp nhất với nhu cầu của bạn.

+1

tại sao bạn lại nói vậy ?? Bạn có một số liên kết mà nói rằng phương pháp này là không thích hợp ,, hoặc bất kỳ cách tiếp cận khác khác là tốt hơn? – genericuser

+0

@ Priya10 SOAP là giao thức hỗ trợ việc triển khai kiến ​​trúc đối tượng từ xa. REST là phong cách kiến ​​trúc hoàn toàn khác nhau. Hoặc là một cách tiếp cận hợp lệ, cho kịch bản đúng, nhưng cả hai đều không tương thích. –

+2

@DarrelMiller: điều đó sẽ không bay khi một khách hàng muốn REST và một người khác muốn các giao diện SOAP về cơ bản cùng chức năng – DeepSpace101

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