Lược đồ URI được cung cấp 'https' không hợp lệ; dự kiến ​​'http'. Tên tham số: thông qua


281

Tôi đang cố gắng tạo một dịch vụ WCF qua basicHttpBinding để được sử dụng qua https. Đây là web.config của tôi:

<!-- 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>

Tôi đang kết nối bằng WCFStorm có thể truy xuất tất cả dữ liệu meta đúng cách, nhưng khi tôi gọi phương thức thực tế tôi nhận được:

Lược đồ URI được cung cấp 'https' không hợp lệ; dự kiến ​​'http'. Tên tham số: thông qua


4
Trong tiếng Đức, thông báo lỗi có nội dung " Das bereitgestellte URI-Schema" https "ist ungültig; erwartet wurde" http " .
Uwe Keim

Câu trả lời:


240

Hãy thử thêm thông tin đăng nhập trên app.config như:

<bindings> 
<basicHttpBinding> 
<binding name="defaultBasicHttpBinding"> 
  <security mode="Transport"> 
    <transport clientCredentialType="None" proxyCredentialType="None" realm=""/> 
    <message clientCredentialType="Certificate" algorithmSuite="Default" />
  </security> 
</binding> 
</basicHttpBinding> 
</bindings> 

35
Cảm ơn bạn đã phản hồi này cho OP; Tôi đã gặp vấn đề tương tự và thay đổi chế độ của thẻ <security> từ mặc định của "Không" thành "Vận chuyển" đã sửa nó.
Otis

1
Ngoại trừ khối <message> bị IIS6 từ chối vì một số lý do, điều này hoạt động tốt.
Chris Chubb

4
sao chép cùng một cấu hình cho dự án của tôi nhưng điều đó không có hiệu quả. Tôi đã bỏ lỡ bất cứ điều gì để thêm?

1
Cảm ơn bạn rất nhiều. Tôi đã thử một số giải pháp được tìm thấy trực tuyến nhưng không có giải pháp nào trong số đó có hiệu quả. Điều này là hoàn hảo.
triển aspnet

59

Thêm điều này như một câu trả lời, chỉ vì bạn không thể thực hiện nhiều định dạng ưa thích trong các bình luận.
Tôi đã có cùng một vấn đề, ngoại trừ tôi đang tạo và ràng buộc khách hàng dịch vụ web của tôi hoàn toàn bằng mã.
Lý do là DLL đã được tải lên một hệ thống, trong đó cấm sử dụng các tập tin cấu hình.

Đây là mã cần được cập nhật để liên lạc qua 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

Làm thế nào bạn tạo các lớp cho dịch vụ web của bạn?
kaiyaq

nó hoạt động Tôi đã có cùng một vấn đề trong C # của tôi. Chỉ cần sao chép dán và giải quyết vấn đề.
dùng3417479

@kaiyaq - Tôi vẫn có thể kết nối với dịch vụ tốt để phát triển với tất cả các công cụ tiêu chuẩn, cho phép VS tạo các lớp cho tôi, sau đó được biên dịch vào DLL. Chỉ trong thời gian chạy, tôi không thể tải lên tệp cấu hình với tất cả thông tin kết nối.
eidylon

BasicHttpBinding hiện diện thông qua việc sử dụng System.ServiceModel; Độc giả tương lai FYI.
DLeh

38

Thay đổi từ

<security mode="None">

đến

<security mode="Transport">

trong tệp web.config của bạn. Thay đổi này sẽ cho phép bạn sử dụng https thay vì http


30

Bạn đang chạy cái này trên Cassini (so với máy chủ dev) hay trên IIS với chứng chỉ được cài đặt? Tôi đã có vấn đề trong quá khứ khi cố gắng kết nối các điểm cuối an toàn trên máy chủ web dev.

Đây là cấu hình ràng buộc đã làm việc cho tôi trong quá khứ. Thay vì basicHttpBinding, nó sử dụng wsHttpBinding. Tôi không biết nếu đó là một vấn đề cho bạn.

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

và điểm cuối

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

Ngoài ra, hãy đảm bảo bạn thay đổi cấu hình máy khách để bật Bảo mật vận chuyển.


1
IIS 7 cục bộ với chứng chỉ tự ký được cài đặt
isg

13
"Ngoài ra, hãy đảm bảo bạn thay đổi cấu hình máy khách để bật Bảo mật vận chuyển." -- Lời khuyên tốt. Quá dễ dàng bị bỏ qua và WCF sẽ không đưa ra manh mối về lỗi của nó.
Luke Puplett


20

Tôi đã có ngoại lệ tương tự trong một custom bindingkịch bản. Bất cứ ai sử dụng phương pháp này, cũng có thể kiểm tra điều này.

Tôi đã thực sự thêm các tham chiếu dịch vụ từ một local WSDL tập tin. Nó đã được thêm thành công và yêu cầu ràng buộc tùy chỉnh đã được thêm vào tập tin cấu hình. Tuy nhiên, dịch vụ thực tế là https; không http. Vì vậy, tôi đã thay đổi từ xa httpTransport là httpsTransport. Điều này đã khắc phục sự cố

<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>

Người giới thiệu

  1. WCF với tùy chỉnh trên cả http và https

19

Tôi đã có vấn đề CHÍNH XÁC tương tự như OP. Cấu hình và tình hình của tôi là giống hệt nhau. Cuối cùng tôi đã thu hẹp nó thành một vấn đề trong WCFStorm sau khi tạo tham chiếu dịch vụ trong một dự án thử nghiệm trong Visual Studio và xác nhận rằng dịch vụ đang hoạt động. Trong Storm, bạn cần nhấp vào tùy chọn cài đặt "Cấu hình" (KHÔNG phải là "Cấu hình máy khách"). Sau khi nhấp vào đó, nhấp vào tab "Bảo mật" trên hộp thoại bật lên. Đảm bảo "Loại xác thực" được đặt thành "Không" (Mặc định là "Xác thực Windows"). Presto, nó hoạt động! Tôi luôn thử nghiệm các phương thức của mình trong WCFStorm khi tôi xây dựng chúng, nhưng chưa bao giờ thử sử dụng nó để kết nối với phương thức đã được thiết lập trên SSL. Hy vọng điều này sẽ giúp được ai đó!


Tôi đã có vấn đề chính xác như vậy, nhưng tôi đã nhập sai mật khẩu bằng cách sử dụng "Tên người dùng / Xác thực mật khẩu". Hóa ra nếu bạn thay đổi mật khẩu, bạn cần nhấp vào URL của dịch vụ và nút "Làm mới" trên thanh công cụ để lấy mật khẩu.
Ryan Shillington

12

Chạy vào cùng một vấn đề, đây là cách giải pháp của tôi bật ra ở cuối:

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

Về cơ bản, tôi đã thay thế mọi lần xuất hiện của HTTP bằng Https. Bạn có thể thử thêm cả hai nếu bạn thích.


5
Cần lưu ý rằng basicHttpsBinding là 4,5 và mới hơn.
Jagd

7

Nếu bạn làm điều này theo chương trình và không có trong web.config thì:

new WebHttpBinding(WebHttpSecurityMode.Transport)

Tuyệt quá. Tôi luôn ghét các tập tin .exe.config và thay vào đó làm mọi thứ bằng mã. Điều này đã giải quyết vấn đề của tôi.
nivs1978

4

Bạn nên nhớ rằng các tệp cấu hình có thể được phân chia thành các tệp thứ cấp để giúp thay đổi cấu hình dễ dàng hơn trên các máy chủ khác nhau (dev / demo / sản xuất, v.v.), mà không phải biên dịch lại mã / ứng dụng, v.v. Ví dụ: chúng tôi sử dụng chúng để cho phép các kỹ sư tại chỗ thực hiện thay đổi điểm cuối mà không thực sự chạm vào các tệp 'thực'.

Bước đầu tiên là chuyển phần liên kết ra khỏi WPF App.Config vào tệp riêng của nó.

Phần hành vi được đặt để cho phép cả http và https (dường như không có ảnh hưởng đến ứng dụng nếu cả hai được cho phép)

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

Và chúng tôi di chuyển phần ràng buộc ra tập tin riêng của mình;

 <bindings configSource="Bindings.config" /> 

Trong tệp bindings.config, chúng tôi chuyển đổi bảo mật dựa trên giao thức

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

Bây giờ các kỹ sư trên trang web chỉ cần thay đổi tệp Bindings.Config và Client.Config nơi chúng tôi lưu trữ URL thực tế cho mỗi điểm cuối.

Bằng cách này, chúng tôi có thể thay đổi điểm cuối từ http sang https và quay lại để kiểm tra ứng dụng mà không phải thay đổi bất kỳ mã nào.

Hi vọng điêu nay co ich.


2

Để giới hạn lại câu hỏi trong OP:

Tôi đang kết nối [với dịch vụ WCF] bằng WCFStorm có thể truy xuất tất cả dữ liệu meta đúng cách, nhưng khi tôi gọi phương thức thực tế tôi nhận được:

Lược đồ URI được cung cấp 'https' không hợp lệ; dự kiến ​​'http'. Tên tham số: thông qua

Các hướng dẫn WCFStorm giải quyết vấn đề này khi làm việc với IIS và SSL .

Giải pháp của họ làm việc cho tôi:

  1. Để khắc phục lỗi, tạo cấu hình máy khách phù hợp với cấu hình dịch vụ wcf. Cách dễ nhất để làm điều này là với Visual Studio.

    • Mở Visual Studio và thêm một tham chiếu dịch vụ vào dịch vụ. VS sẽ tạo một tệp app.config phù hợp với dịch vụ

    • Chỉnh sửa tệp app.config để WCFStorm có thể đọc được. Vui lòng xem Đang tải các tệp App.config . Đảm bảo rằng các thuộc tính endpoint / @ name và endpoint / @ khớp với các giá trị trong wcfstorm.

  2. Tải app.config đã sửa đổi vào WCFStorm [bằng cách sử dụng nút toobar Cấu hình máy khách].

  3. Gọi phương thức. Lần này việc gọi phương thức sẽ không còn thất bại

Mục (1) dấu đầu dòng cuối cùng có hiệu lực có nghĩa là loại bỏ tiền tố không gian tên mà VS chuẩn bị cho thuộc tính hợp đồng điểm cuối, theo mặc định "ServiceReference1"

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

vì vậy trong app.config mà bạn tải vào WCFStorm bạn muốn cho ListsService:

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

2

Tôi cần các ràng buộc sau đây để làm cho tôi làm việc:

        <binding name="SI_PurchaseRequisition_ISBindingSSL">
          <security mode="Transport">
            <transport clientCredentialType="Basic" proxyCredentialType="None" realm="" />
          </security>
        </binding>

1

wsHttpBinding là một vấn đề vì silverlight không hỗ trợ nó!


Để tham khảo: Cả Windows Phone 7, Windows Phone 8 hay WinRT đều không.
Jon B

Tôi đã thêm một câu trả lời cho silverlight
Simon_Weaver
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.