331

I am trying to make a WCF service over basicHttpBinding to be used over https. Here's my web.config:

<!-- language: xml -->
<service behaviorConfiguration="MyServices.PingResultServiceBehavior"
         name="MyServices.PingResultService">
    <endpoint address="" 
              binding="basicHttpBinding" 
              bindingConfiguration="defaultBasicHttpBinding"
              contract="MyServices.IPingResultService">
        <identity>
            <dns value="localhost" />
        </identity>
    </endpoint>
    <endpoint address="mex" 
              binding="mexHttpBinding" 
              contract="IMetadataExchange" />
</service>
...
<bindings>
  <basicHttpBinding>
    <binding name="defaultBasicHttpBinding">
      <security mode="Transport">
        <transport clientCredentialType="None"/>
      </security>
    </binding>
  </basicHttpBinding>
</bindings>
...
<behaviors>
  <serviceBehaviors>
    <behavior name="MyServices.UpdateServiceBehavior">
      <serviceMetadata httpsGetEnabled="true" />
      <serviceDebug includeExceptionDetailInFaults="true" />
    </behavior>
  </serviceBehaviors>
</behaviors>

I am connecting using WCFStorm which is able to retrieve all the meta data properly, but when I call the actual method I get:

The provided URI scheme 'https' is invalid; expected 'http'. Parameter name: via

Selim Yildiz
  • 5,254
  • 6
  • 18
  • 28
isg
  • 3,311
  • 2
  • 16
  • 3
  • 12
    In German, the error message reads "**Das bereitgestellte URI-Schema "https" ist ungültig; erwartet wurde "http". Parametername: via**", in case anyone is googling this. – Uwe Keim Jun 03 '19 at 13:26

16 Answers16

273

Try adding message credentials on your app.config like:

<bindings> 
<basicHttpBinding> 
<binding name="defaultBasicHttpBinding"> 
  <security mode="Transport"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
    <message clientCredentialType="Certificate" algorithmSuite="Default" />
  </security> 
</binding> 
</basicHttpBinding> 
</bindings> 
Liam
  • 27,717
  • 28
  • 128
  • 190
Jojo Sardez
  • 8,400
  • 3
  • 27
  • 38
  • 40
    Thank you for this response to the OP; I was having the same issue and changing the tag's mode from the default of "None" to "Transport" fixed it. – Otis Apr 07 '11 at 23:29
  • 1
    Except for the block, which was rejected by IIS6 for some reason, this worked well. – Chris Chubb Apr 09 '13 at 03:08
  • 4
    copied the same configuration to my project but that gives effect nothing. Did I miss anything to add? –  Feb 22 '16 at 07:32
  • 1
    Thank you so much. I tried several solutions found online but none of them worked. This one was perfect. – aspnetdeveloper Jan 05 '17 at 23:04
  • How to add credentials the application is of type asp.net core where app.config/web.config do not exist? – Kurkula Oct 11 '22 at 21:29
74

Adding this as an answer, just since you can't do much fancy formatting in comments.
I had the same issue, except I was creating and binding my web service client entirely in code.
Reason is the DLL was being uploaded into a system, which prohibited the use of config files.

Here is the code as it needed to be updated to communicate over SSL...

Public Function GetWebserviceClient() As WebWorker.workerSoapClient
    Dim binding = New BasicHttpBinding()
    binding.Name = "WebWorkerSoap"
    binding.CloseTimeout = TimeSpan.FromMinutes(1)
    binding.OpenTimeout = TimeSpan.FromMinutes(1)
    binding.ReceiveTimeout = TimeSpan.FromMinutes(10)
    binding.SendTimeout = TimeSpan.FromMinutes(1)

    '// HERE'S THE IMPORTANT BIT FOR SSL
    binding.Security.Mode = BasicHttpSecurityMode.Transport

    Dim endpoint = New EndpointAddress("https://myurl/worker.asmx")

    Return New WebWorker.workerSoapClient(binding, endpoint)
End Function
eidylon
  • 7,068
  • 20
  • 75
  • 118
  • How did you create the classes for your web service? –  Feb 10 '17 at 01:21
  • it works! I had the same problem in my C#. Just copy paste and problem solved. – user3417479 Dec 10 '18 at 15:16
  • @kaiyaq - I can still connect to the service fine for development with all the standard stuff, letting VS create the classes for me, which then get compiled into the DLL. It's just at runtime I can't upload the config file with all the connection information. – eidylon Jan 04 '19 at 21:28
  • BasicHttpBinding is present via using System.ServiceModel; FYI future readers. – DLeh Mar 17 '20 at 17:58
  • 7 years later, still awesome – Artur Peniche Jul 01 '21 at 21:48
47

Change from

<security mode="None">

to

<security mode="Transport">

in your web.config file. This change will allow you to use https instead of http

Amir Md Amiruzzaman
  • 1,911
  • 25
  • 24
29

Are you running this on the Cassini (vs dev server) or on IIS with a cert installed? I have had issues in the past trying to hook up secure endpoints on the dev web server.

Here is the binding configuration that has worked for me in the past. Instead of basicHttpBinding, it uses wsHttpBinding. I don't know if that is a problem for you.

<!-- Binding settings for HTTPS endpoint -->
<binding name="WsSecured">
    <security mode="Transport">
        <transport clientCredentialType="None" />
        <message clientCredentialType="None"
            negotiateServiceCredential="false"
            establishSecurityContext="false" />
    </security>
</binding>

and the endpoint

<endpoint address="..." binding="wsHttpBinding"
    bindingConfiguration="WsSecured" contract="IYourContract" />

Also, make sure you change the client configuration to enable Transport security.

Liam
  • 27,717
  • 28
  • 128
  • 190
pattersonc
  • 1,282
  • 11
  • 13
20

I had same exception in a custom binding scenario. Anybody using this approach, can check this too.

I was actually adding the service reference from a local WSDL file. It got added successfully and required custom binding was added to config file. However, the actual service was https; not http. So I changed the httpTransport elemet as httpsTransport. This fixed the problem

<system.serviceModel>
<bindings>

  <customBinding>
    <binding name="MyBindingConfig">

      <textMessageEncoding maxReadPoolSize="64" maxWritePoolSize="16"
        messageVersion="Soap11" writeEncoding="utf-8">
        <readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
          maxBytesPerRead="4096" maxNameTableCharCount="16384" />
      </textMessageEncoding>

      <!--Manually changed httpTransport to httpsTransport-->
      <httpsTransport manualAddressing="false" maxBufferPoolSize="524288"
        maxReceivedMessageSize="65536" allowCookies="false" authenticationScheme="Anonymous"
        bypassProxyOnLocal="false" 
        decompressionEnabled="true" hostNameComparisonMode="StrongWildcard"
        keepAliveEnabled="true" maxBufferSize="65536" 
        proxyAuthenticationScheme="Anonymous"
        realm="" transferMode="Buffered" unsafeConnectionNtlmAuthentication="false"
        useDefaultWebProxy="true" />
    </binding>
  </customBinding>

</bindings>

<client>
  <endpoint address="https://mainservices-certint.mycompany.com/Services/HRTest"
    binding="customBinding" bindingConfiguration="MyBindingConfig"
    contract="HRTest.TestWebserviceManagerImpl" name="TestWebserviceManagerImpl" />
</client>


</system.serviceModel>

References

  1. WCF with custombinding on both http and https
Community
  • 1
  • 1
LCJ
  • 22,196
  • 67
  • 260
  • 418
19

I had the EXACT same issue as the OP. My configuration and situation were identical. I finally narrowed it down to being an issue in WCFStorm after creating a service reference in a test project in Visual Studio and confirming that the service was working. In Storm you need to click on the "Config" settings option (NOT THE "Client Config"). After clicking on that, click on the "Security" tab on the dialog that pops up. Make sure "Authentication Type" is set to "None" (The default is "Windows Authentication"). Presto, it works! I always test out my methods in WCFStorm as I'm building them out, but have never tried using it to connect to one that has already been set up on SSL. Hope this helps someone!

Randy Staats
  • 394
  • 4
  • 4
  • I had this exact same problem, but I had the wrong password using "Username/Password Authentication". It turns out that if you change your password, you need to click the URL of the service and the "Refresh" button on the toolbar for it to take it. – Ryan Shillington Sep 14 '16 at 14:49
14

Ran into the same issue, this is how my solution turned out at the end:

        <basicHttpsBinding>
            <binding name="VerificationServicesPasswordBinding">
              <security mode="Transport">
              </security>
            </binding>
            <binding name="VerificationServicesPasswordBinding1" />
        </basicHttpsBinding>

I basically replaced every occurrence of Http with Https. You can try adding both of them if you prefer.

Liam
  • 27,717
  • 28
  • 128
  • 190
Fat Shogun
  • 987
  • 1
  • 10
  • 18
7

If you do this programatically and not in web.config its:

new WebHttpBinding(WebHttpSecurityMode.Transport)
Terje Solem
  • 816
  • 1
  • 10
  • 25
  • Great. I always hated the .exe.config files, and do everything by code instead. This solved my problem. – nivs1978 Dec 21 '17 at 08:55
3

Its a good to remember that config files can be split across secondary files to make config changes easier on different servers (dev/demo/production etc), without having to recompile code/app etc. For example we use them to allow onsite engineers to make endpoint changes without actually touching the 'real' files.

First step is to move the bindings section out of the WPF App.Config into it's own separate file.

The behaviours section is set to allow both http and https (doesn't seem to have an affect on the app if both are allowed)

<serviceMetadata httpsGetEnabled="true" httpGetEnabled="true" />

And we move the bindings section out to its own file;

 <bindings configSource="Bindings.config" /> 

In the bindings.config file we switch the security based on protocol

  <!-- None = http:// -->
  <!-- Transport = https:// -->
  <security mode="None" >

Now the on site engineers only need to change the Bindings.Config file and the Client.Config where we store the actual URL for each endpoint.

This way we can change the endpoint from http to https and back again to test the app without having to change any code.

Hope this helps.

chillfire
  • 406
  • 4
  • 9
2

To re-cap the question in the OP:

I am connecting [to a WCF service] using WCFStorm which is able to retrieve all the meta data properly, but when I call the actual method I get:

The provided URI scheme 'https' is invalid; expected 'http'. Parameter name: via

The WCFStorm tutorials addresses this issue in Working with IIS and SSL.

Their solution worked for me:

  1. To fix the error, generate a client config that matches the wcf service configuration. The easiest way to do this is with Visual Studio.

    • Open Visual Studio and add a service reference to the service. VS will generate an app.config file that matches the service

    • Edit the app.config file so that it can be read by WCFStorm. Please see Loading Client App.config files. Ensure that the endpoint/@name and endpoint/@contract attributes match the values in wcfstorm.

  2. Load the modified app.config to WCFStorm [using the Client Config toobar button].

  3. Invoke the method. This time the method invocation will no longer fail

Item (1) last bullet in effect means to remove the namespace prefix that VS prepends to the endpoint contract attribute, by default "ServiceReference1"

<endpoint ... contract="ServiceReference1.ListsService" ... />

so in the app.config that you load into WCFStorm you want for ListsService:

<endpoint ... contract="ListsService" ... />
JohnC
  • 1,797
  • 1
  • 18
  • 26
2

I needed the following bindings to get mine to work:

        <binding name="SI_PurchaseRequisition_ISBindingSSL">
          <security mode="Transport">
            <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
          </security>
        </binding>
Flea
  • 11,176
  • 6
  • 72
  • 83
1

wsHttpBinding is a problem because silverlight doesn't support it!

Jason Henriksen
  • 289
  • 1
  • 2
  • 6
1

I've added a "Connected Service" to our project by Visual Studio which generated a default method to create Client.

var client = new MyWebService.Client(MyWebService.Client.EndpointConfiguration.MyPort, _endpointUrl);

This constructor inherits ClientBase and behind the scene is creating Binding by using its own method Client.GetBindingForEndpoint(endpointConfiguration):

public Client(EndpointConfiguration endpointConfiguration, string remoteAddress) :
            base(Client.GetBindingForEndpoint(endpointConfiguration), 
                 new System.ServiceModel.EndpointAddress(remoteAddress))

This method has different settings for https service and http service. When you want get data from http, you should use TransportCredentialOnly:

System.ServiceModel.BasicHttpBinding result = new System.ServiceModel.BasicHttpBinding();
result.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.TransportCredentialOnly;
 

For https you should use Transport:

result.Security.Mode = System.ServiceModel.BasicHttpSecurityMode.Transport;
soupy-norman
  • 403
  • 2
  • 11
0

In my case in web.config I had to change binding="basicHttpsBinding" to binding="basicHttpBinding" in the endpoint definition and copy the relative bindingConfiguration to basicHttpBinding section

-1
<!-- Binding settings for HTTPS endpoint -->
<binding name="yourServiceName">
    <security mode="Transport">
        <transport clientCredentialType="None" />
        <!-- Don't use message -->
    </security>
</binding>
General Grievance
  • 4,555
  • 31
  • 31
  • 45
-1

My solution, having encountered the same error message, was even simpler than the ones above, I just updated the to basicHttpsBinding>

  <bindings>
    <basicHttpsBinding>
    <binding name="ShipServiceSoap" maxBufferPoolSize="512000" maxReceivedMessageSize="512000" />
    </basicHttpsBinding>
    </bindings>

And the same in the section below:

  <client>
    <endpoint address="https://s.asmx" binding="basicHttpsBinding" bindingConfiguration="ShipServiceSoap" contract="..ServiceSoap" name="ShipServiceSoap" />
    </client>
Edward
  • 79
  • 1
  • 7