รูปแบบ URI ที่ให้ไว้ 'https' ไม่ถูกต้อง คาดว่า 'http' ชื่อพารามิเตอร์: ผ่าน


281

ฉันพยายามให้บริการ WCF ผ่านทาง BasicHttpBinding เพื่อใช้ผ่าน https นี่คือเว็บของฉัน 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>

ฉันกำลังเชื่อมต่อโดยใช้ WCFStorm ซึ่งสามารถดึงข้อมูลเมตาทั้งหมดได้อย่างถูกต้อง แต่เมื่อฉันเรียกวิธีการจริงฉันจะได้รับ:

รูปแบบ URI ที่ให้ไว้ 'https' ไม่ถูกต้อง คาดว่า 'http' ชื่อพารามิเตอร์: ผ่าน


4
ในภาษาเยอรมันข้อความแสดงข้อผิดพลาดจะอ่านว่า " Das bereitgestellte URI-Schema" https "ist ungültig; erwartet wurde" http ". Parametername: via " ในกรณีที่ใครก็ตามที่ไปนี้
Uwe Keim

คำตอบ:


240

ลองเพิ่มข้อมูลรับรองข้อความในแอปของคุณกำหนดค่าเช่น:

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

35
ขอบคุณสำหรับการตอบสนองต่อ OP นี้ ฉันมีปัญหาเดียวกันและเปลี่ยนโหมดแท็ก <security> จากค่าเริ่มต้นของ "ไม่มี" เป็น "ขนส่ง" แก้ไข
โอทิส

1
ยกเว้นบล็อก <message> ซึ่งถูกปฏิเสธโดย IIS6 ด้วยเหตุผลบางอย่างสิ่งนี้ใช้ได้ดี
Chris Chubb

4
คัดลอกการกำหนดค่าเดียวกันกับโครงการของฉัน แต่ไม่มีผลอะไรเลย ฉันพลาดอะไรที่จะเพิ่มหรือไม่?

1
ขอบคุณมาก. ฉันลองใช้วิธีแก้ไขปัญหาหลายวิธีที่พบทางออนไลน์ แต่ไม่มีวิธีใดที่ทำงานได้ อันนี้สมบูรณ์แบบ
aspnetdeveloper

59

การเพิ่มนี่เป็นคำตอบเนื่องจากคุณไม่สามารถจัดรูปแบบแฟนซีในความคิดเห็นได้
ฉันมีปัญหาเดียวกันยกเว้นฉันกำลังสร้างและผูกลูกค้าบริการเว็บของฉันทั้งหมดในรหัส
สาเหตุที่ DLL ถูกอัพโหลดเข้าสู่ระบบซึ่งห้ามใช้ไฟล์ปรับแต่ง

นี่คือรหัสตามที่จำเป็นต้องได้รับการอัพเดตเพื่อสื่อสารผ่าน 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

คุณสร้างคลาสสำหรับบริการบนเว็บของคุณได้อย่างไร
kaiyaq

มันได้ผล! ฉันมีปัญหาเดียวกันใน C # ของฉัน เพียงคัดลอกวางและแก้ไขปัญหาได้
user3417479

@ kaiyaq - ฉันยังคงสามารถเชื่อมต่อกับบริการที่ดีสำหรับการพัฒนากับทุกสิ่งมาตรฐานปล่อยให้ VS สร้างชั้นเรียนสำหรับฉันซึ่งจากนั้นได้รับการรวบรวมเป็น DLL เป็นตอนรันไทม์ฉันไม่สามารถอัพโหลดไฟล์ปรับแต่งพร้อมกับข้อมูลการเชื่อมต่อทั้งหมดได้
eidylon

BasicHttpBinding มีอยู่ผ่านการใช้ System.ServiceModel; ผู้อ่านในอนาคตของ FYI
DLeh

38

เปลี่ยนจาก

<security mode="None">

ถึง

<security mode="Transport">

ในไฟล์ web.config ของคุณ การเปลี่ยนแปลงนี้จะอนุญาตให้คุณใช้ https แทน http


30

คุณกำลังใช้งานสิ่งนี้บน Cassini (เซิร์ฟเวอร์ vs dev) หรือ IIS ที่ติดตั้งใบรับรองหรือไม่ ฉันเคยมีปัญหาในอดีตพยายามเชื่อมต่ออุปกรณ์ปลายทางที่ปลอดภัยบนเว็บเซิร์ฟเวอร์ dev

นี่คือการกำหนดค่าการเชื่อมที่มีผลกับฉันในอดีต แทนการที่จะใช้basicHttpBinding wsHttpBindingฉันไม่รู้ว่านั่นเป็นปัญหาสำหรับคุณหรือไม่

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

และจุดสิ้นสุด

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

ตรวจสอบให้แน่ใจว่าคุณเปลี่ยนการกำหนดค่าไคลเอนต์เพื่อเปิดใช้งานความปลอดภัยการขนส่ง


1
IIS ท้องถิ่น 7 ที่ติดตั้งใบรับรองแบบลงนามด้วยตนเอง
isg

13
"ตรวจสอบให้แน่ใจว่าคุณเปลี่ยนการกำหนดค่าไคลเอนต์เพื่อเปิดใช้งานความปลอดภัยของการขนส่ง" -- คำปรึกษาที่ดี. มองข้ามง่ายเกินไปและ WCF จะไม่ให้เบาะแสในข้อผิดพลาด
ลุค Puplett

ไม่ถูกต้องเจรจาต่อรอง
ServiceCredential

20

ฉันมีข้อยกเว้นในcustom bindingสถานการณ์เดียวกัน ใครก็ตามที่ใช้วิธีการนี้สามารถตรวจสอบได้เช่นกัน

จริงๆแล้วฉันเพิ่มการอ้างอิงบริการจาก local WSDL ไฟล์ มันถูกเพิ่มสำเร็จแล้วและการผูกแบบกำหนดเองที่ต้องการถูกเพิ่มเข้ากับไฟล์ปรับแต่ง อย่างไรก็ตามบริการจริงคือ https; ไม่ใช่ http ดังนั้นผมจึงเปลี่ยน httpTransport elemet httpsTransportเป็น วิธีนี้แก้ไขปัญหาได้

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

อ้างอิง

  1. WCF พร้อมการผูกแบบกำหนดเองบนทั้ง http และ https

19

ฉันมีปัญหาเดียวกันกับ OP การกำหนดค่าและสถานการณ์ของฉันเหมือนกัน ในที่สุดฉันก็แคบลงจนกลายเป็นปัญหาใน WCFStorm หลังจากสร้างการอ้างอิงบริการในโครงการทดสอบใน Visual Studio และยืนยันว่าบริการกำลังทำงานอยู่ ใน Storm คุณต้องคลิกที่ตัวเลือกการตั้งค่า "กำหนดค่า" (ไม่ใช่ "การกำหนดค่าไคลเอ็นต์") หลังจากคลิกที่คลิกที่แท็บ "ความปลอดภัย" ในกล่องโต้ตอบที่ปรากฏขึ้น ตรวจสอบให้แน่ใจว่า "ประเภทการตรวจสอบความถูกต้อง" ถูกตั้งค่าเป็น "ไม่มี" (ค่าเริ่มต้นคือ "การพิสูจน์ตัวจริงของ Windows") Presto มันใช้งานได้! ฉันมักจะทดสอบวิธีการของฉันใน WCFStorm ขณะที่ฉันสร้างพวกเขาออกมา แต่ไม่เคยลองใช้มันเพื่อเชื่อมต่อกับหนึ่งที่ได้รับการตั้งค่าบน SSL หวังว่านี่จะช่วยใครซักคน!


ฉันมีปัญหาเดียวกันนี้ แต่ฉันมีรหัสผ่านผิดโดยใช้ "ชื่อผู้ใช้ / การตรวจสอบรหัสผ่าน" ปรากฎว่าหากคุณเปลี่ยนรหัสผ่านคุณจะต้องคลิก URL ของบริการและปุ่ม "รีเฟรช" บนแถบเครื่องมือเพื่อนำไปใช้
Ryan Shillington

12

พบปัญหาเดียวกันนี่คือวิธีที่โซลูชันของฉันเปิดออกในตอนท้าย:

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

ฉันมักจะแทนที่ Http ทุกครั้งด้วย Https คุณสามารถลองเพิ่มทั้งคู่ได้หากต้องการ


5
ควรสังเกตว่า basicHttpsBinding คือ 4.5 และใหม่กว่า
Jagd

7

หากคุณทำสิ่งนี้โดยทางโปรแกรมและไม่อยู่ใน web.config:

new WebHttpBinding(WebHttpSecurityMode.Transport)

ยิ่งใหญ่ ฉันเกลียดไฟล์. exe.config และทำทุกอย่างด้วยรหัสแทน นี่เป็นการแก้ไขปัญหาของฉัน
nivs1978

4

เป็นเรื่องที่ดีที่ต้องจำไว้ว่าไฟล์การกำหนดค่าสามารถแบ่งไฟล์รองเพื่อให้การเปลี่ยนแปลงการกำหนดค่าง่ายขึ้นบนเซิร์ฟเวอร์ที่แตกต่างกัน (dev / สาธิต / การผลิต ฯลฯ ) โดยไม่ต้องคอมไพล์โค้ด / แอปเป็นต้นตัวอย่างเช่นเราใช้พวกมัน ทำการเปลี่ยนแปลงจุดสิ้นสุดโดยไม่ต้องแตะที่ไฟล์ 'ของจริง'

ขั้นตอนแรกคือย้ายส่วนการเชื่อมโยงออกจาก WPF App.Config ลงในไฟล์แยกต่างหากของตัวเอง

ส่วนของพฤติกรรมนั้นได้รับการตั้งค่าให้อนุญาตทั้ง http และ https (ดูเหมือนจะไม่มีผลกระทบกับแอพหากทั้งคู่ได้รับอนุญาต)

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

และเราย้ายส่วนการเชื่อมโยงออกไปเป็นไฟล์ของมันเอง

 <bindings configSource="Bindings.config" /> 

ในไฟล์ bindings.config เราสลับการรักษาความปลอดภัยตามโปรโตคอล

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

ในตอนนี้วิศวกรประจำไซต์ต้องเปลี่ยนไฟล์ Bindings.Config และ Client.Config ที่เราเก็บ URL จริงสำหรับแต่ละปลายทาง

วิธีนี้เราสามารถเปลี่ยนจุดปลายจาก http เป็น https และกลับมาอีกครั้งเพื่อทดสอบแอปโดยไม่ต้องเปลี่ยนรหัสใด ๆ

หวังว่านี่จะช่วยได้


2

หากต้องการใส่คำถามอีกครั้งใน OP:

ฉันกำลังเชื่อมต่อ [กับบริการ WCF] โดยใช้ WCFStorm ซึ่งสามารถดึงข้อมูลเมตาทั้งหมดได้อย่างถูกต้อง แต่เมื่อฉันเรียกวิธีการจริงฉันจะได้รับ:

รูปแบบ URI ที่ให้ไว้ 'https' ไม่ถูกต้อง คาดว่า 'http' ชื่อพารามิเตอร์: ผ่าน

WCFStorm tutorials อยู่ปัญหานี้ในการทำงานกับ IIS และ SSL

วิธีแก้ปัญหาของพวกเขาใช้งานได้สำหรับฉัน:

  1. ในการแก้ไขข้อผิดพลาดให้สร้างการกำหนดค่าไคลเอนต์ที่ตรงกับการกำหนดค่าบริการ wcf วิธีที่ง่ายที่สุดคือการใช้ Visual Studio

    • เปิด Visual Studio และเพิ่มการอ้างอิงบริการไปยังบริการ VS จะสร้างไฟล์ app.config ที่ตรงกับบริการ

    • แก้ไขไฟล์ app.config เพื่อให้สามารถอ่านได้โดย WCFStorm โปรดดูโหลดไฟล์ไคลเอ็นต์ App.config ตรวจสอบให้แน่ใจว่าแอ็ตทริบิวต์ endpoint / @ name และ endpoint / @ contract ตรงกับค่าใน wcfstorm

  2. โหลด app.config ที่แก้ไขแล้วไปที่ WCFStorm [โดยใช้ปุ่มไคลเอนต์แถบเครื่องมือกำหนดค่าไคลเอ็นต์]

  3. เรียกใช้เมธอด เวลานี้การเรียกใช้เมธอดจะไม่ล้มเหลวอีกต่อไป

รายการ (1) กระสุนสุดท้ายที่มีผลหมายถึงการลบคำนำหน้าเนมสเปซที่ VS ผนวกกับแอตทริบิวต์สัญญาจุดสิ้นสุดโดยค่าเริ่มต้น "ServiceReference1"

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

ดังนั้นใน app.config ที่คุณโหลดเข้า WCFStorm ที่คุณต้องการสำหรับ ListsService:

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

2

ฉันต้องการการผูกต่อไปนี้เพื่อให้ฉันทำงาน:

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

1

wsHttpBinding เป็นปัญหาเพราะซิลเวอร์ไลท์ไม่รองรับ!


สำหรับการอ้างอิง: ไม่ใช้ Windows Phone 7, Windows Phone 8 หรือ WinRT
Jon B

ฉันได้เพิ่มคำตอบสำหรับ silverlight
Simon_Weaver
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.