39

I have a RESTful Web Service hosted in IIS 6.0, I am able to Browse the Service in browser. When i am trying to access the same service via Client console App, it is giving me the following error:

"provided URI scheme'http' is invalid; expected 'https', Parameter name: Via"

My WebService web.config has this settings:

<system.serviceModel>  
<services>  
  <service behaviorConfiguration="ServiceBehavior" name="TestAPI">
    <endpoint address="" behaviorConfiguration="RESTFriendly" binding="webHttpBinding" contract="ITestAPI" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  </service>     
</services>
<behaviors>
  <endpointBehaviors>
    <behavior name="RESTFriendly">
      <webHttp />
    </behavior>
  </endpointBehaviors>
  <serviceBehaviors>
    <behavior name="ServiceBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

My Client App has App.config from where i am getting the address :

<appSettings>
<add key="WEBSERVICE" value="URL"/>

in the Main method :

WebChannelFactory<ITestAPI> cf = new WebChannelFactory<IAPI>(baseAddress);
            WebHttpBinding wb =cf.Endpoint.Binding as WebHttpBinding;
            wb.Security.Transport.ClientCredentialType = HttpClientCredentialType.Basic;
            wb.Security.Mode = WebHttpSecurityMode.Transport;
            cf.Credentials.UserName.UserName = "usermane";
            cf.Credentials.UserName.Password = "password";

            ITestAPI channel = cf.CreateChannel();
            string msg = channel.TestMethod(); 

When it tries to call TestMethod, it gives me this error.

1 Answer 1

75

You're setting the security to transport mode, which is HTTPS, with this line:

wb.Security.Mode = WebHttpSecurityMode.Transport;

Is the value of baseAddress an HTTP or HTTPS address?

Sign up to request clarification or add additional context in comments.

4 Comments

That's the problem. You're specifying that you want a secure transport, but HTTP is not a secure transport.
This setting might alternatively be present in web.config, in an element like this: <security mode="Transport"> ... </security> In that case, just remove or comment the whole security section, to be able to use http instead of https.
I am facing the same issue
This was very helpful. I did something like this in my code, to allow the program to handle both HTTPS and HTTP, depending on my URL Settings value. I have a production server that's configured to handle HTTPS, and a test server to handle HTTP (inside the network): if (Settings.Default.URL.Contains("https://")) { binding.Security.Mode = BasicHttpSecurityMode.Transport; } else { binding.Security.Mode = BasicHttpSecurityMode.TransportCredentialOnly; }

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.