2015-05-16 17 views
9

मैं एक ServiceStack आधारित साबुन ग्राहक है, जो HTTP के लिए सही ढंग से संचालित लेकिन जब मैं HTTPS का उपयोग करने की कोशिश यह मुझे इस त्रुटिServiceStack साबुन 1.2 HTTPS क्लाइंट

ServiceStack.WebServiceException: The provided URI scheme 'https' is invalid; ex 
pected 'http'. 
Parameter name: via ---> System.ArgumentException: The provided URI scheme 'http 
s' is invalid; expected 'http'. 
Parameter name: via 
    at System.ServiceModel.Channels.HttpChannelFactory`1.ValidateCreateChannelPar 
ameters(EndpointAddress remoteAddress, Uri via) 
    at System.ServiceModel.Channels.HttpChannelFactory`1.OnCreateChannelCore(Endp 
ointAddress remoteAddress, Uri via) 
    at System.ServiceModel.Channels.ChannelFactoryBase`1.InternalCreateChannel(En 
dpointAddress address, Uri via) 
    at System.ServiceModel.Channels.ServiceChannelFactory.ServiceChannelFactoryOv 
erRequest.CreateInnerChannelBinder(EndpointAddress to, Uri via) 
    at System.ServiceModel.Channels.ServiceChannelFactory.CreateServiceChannel(En 
dpointAddress address, Uri via) 
    at System.ServiceModel.Channels.ServiceChannelFactory.CreateChannel(Type chan 
nelType, EndpointAddress address, Uri via) 
    at System.ServiceModel.ChannelFactory`1.CreateChannel(EndpointAddress address 
, Uri via) 
    at System.ServiceModel.ClientBase`1.CreateChannel() 
    at System.ServiceModel.ClientBase`1.CreateChannelInternal() 
    at System.ServiceModel.ClientBase`1.get_Channel() 
    at ServiceStack.WcfServiceClient.Send(Message message) 
    at ServiceStack.WcfServiceClient.Send[T](Object request) 
    --- End of inner exception stack trace --- 
    at ServiceStack.WcfServiceClient.Send[T](Object request) 
    at ElectronicServiceInterface.ESIClient.Login() 

मैं एक आत्म हस्ताक्षरित प्रमाणपत्र का उपयोग कर रहा है, लेकिन मुझे लगता है मेरी साबुन सेवा को सफलतापूर्वक कॉल करने के लिए कर्ल का उपयोग करने में सक्षम हूं। यह मेरे लिए इंगित करता है कि यह मुद्दा ग्राहक के अंत में है।

मेरे कोड

using (var client = new Soap12ServiceClient(Uri)) 
{ 
    var request = new MyRequestObject { Username = Username, Password = Password }; 
    var response = client.Send<MyResponseObject>(request); 
} 

की तर्ज पर चला जाता है ऊपर के उदाहरण अनुरोध/प्रतिक्रिया डीटीओ वर्ग उपयोग दिखाता है।

कॉन्फ़िगरेशन फ़ाइलों का उपयोग किये बिना इसे HTTPS के साथ काम करने के लिए मुझे क्या करना है, केवल कोड?

+0

सेवाओं की मेजबानी की अपनी कोड/विन्यास जोड़ें:

मैं निम्नलिखित एसएसएल-तटस्थ ग्राहक के साथ आवश्यक कार्यक्षमता को प्राप्त करने में कामयाब रहे। – silver

+0

@silver कोई विन्यास नहीं है। मैंने थोड़ा और कोड जोड़ा है, जो कम से कम 'प्रेषण' कॉल दिखाता है जो अपवाद को ट्रिगर करता है। साबुन सेवा स्वयं सर्विसस्टैक आधारित सेवा (केवल क्लाइंट) नहीं है, लेकिन इस पर ध्यान दिए बिना कि कोड वास्तव में दूसरे छोर पर सर्वर को मारने तक नहीं मिलता है। –

उत्तर

2

कॉन्फ़िगरेशन फ़ाइल के साथ समस्या यह है कि यह हमेशा सीधा और कभी-कभी सादा अनैतिक नहीं होता है। इस सर्विसस्टैक के शीर्ष पर कॉन्फ़िगर-कम कोडिंग मॉडल को बढ़ावा देता है।

 
public class SoapServiceClient : Soap12ServiceClient 
{ 
    public SoapServiceClient(string uri) : base(uri) 
    { 
     if (uri.StartsWithIgnoreCase("https://")) 
     { 
      var binding = (WSHttpBinding)base.Binding; 
      binding.Security.Mode = SecurityMode.Transport; 
     } 
    } 
} 
5

मुझे विश्वास है कि आपकी समस्या आपकी कॉन्फ़िगरेशन फ़ाइल में है, बाइंडिंग टैग में जोड़ने का प्रयास करें। इस ServiceStack.IntegrationTests करने के बारे में आप

<bindings> 
      <basicHttpBinding> 
       <binding name="Endpoint_BasicHttpBinding" /> 
      </basicHttpBinding> 
      <wsHttpBinding> 
       <binding name="Endpoint_WsHttpBinding"> 
        <security mode="None"> 
         <transport clientCredentialType="None" /> 
         <message establishSecurityContext="false" /> 
        </security> 
       </binding> 
      </wsHttpBinding> 
     </bindings> 

होना चाहिए लेकिन इस परीक्षण में, यह केवल HTTP पर काम करने के लिए HTTPS तो तुम सब करने की है बदलने के लिए <transport clientCredentialType="None" /><transport clientCredentialType="transport" />

+0

मेरे पास वास्तव में एक कॉन्फ़िगरेशन फ़ाइल नहीं है। इसलिए बनाना संभवतः जाने का रास्ता है। मैं इसे धन्यवाद देने की कोशिश करूंगा। –

+0

आप मेरे उत्तर में उल्लिखित लिंक का उपयोग कर सकते हैं, यह आपको सभी आवश्यक कॉन्फ़िगरेशन को भरने में मदद करेगा, यह लिंक https://github.com/ServiceStack/ServiceStack/wiki/Config-API –

3

करने के लिए आप की आवश्यकता है नहीं कॉन्फ़िगर किया गया है 2 अलग-अलग आधार पते, HTTP के लिए एक और HTTPS के लिए एक।

आप इसे कॉन्फ़िगरेशन फ़ाइल में या आपके द्वारा होस्ट करने वाले कोड में परिभाषित कर सकते हैं।

+0

सहायता कैसे कर सकता है कोड में? यदि मैं कर सकता हूं तो मैं कॉन्फ़िगरेशन से बचूंगा। यह केवल एक परीक्षण आवेदन गंभीर नहीं है। –

+0

जब आप अपना सेवा होस्ट बनाते हैं तो आपको यूरीस की एक सरणी प्रदान करने की आवश्यकता होती है ताकि दोनों प्रोटोकॉल (नया सर्विसहोस्ट (MyService, new [] {"http: // myService /", "https: // myService /"} प्रदान करें) – silver

संबंधित मुद्दे