ข้อผิดพลาดในการเริ่มต้นบริการ WCF“ ชุดรวมนี้มีที่อยู่ที่มีรูปแบบ http” อยู่แล้ว


182

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

เมื่อฉันปรับใช้กับเซิร์ฟเวอร์สดของเราและเรียกใช้แอปพลิเคชันฉันได้รับข้อยกเว้นประเภทSystem.ServiceModel.ServiceActivationExceptionที่ระบุว่าบริการไม่สามารถเปิดใช้งานได้เนื่องจากข้อยกเว้นระหว่างการรวบรวม ข้อยกเว้นคือ:

คอลเล็กชันนี้มีที่อยู่ที่มีรูปแบบ http อยู่แล้ว สามารถมีที่อยู่ได้สูงสุดหนึ่งรายการต่อแบบแผนในคอลเล็กชันนี้

ฉันอ่านว่าข้อยกเว้นนี้อาจเกิดขึ้นได้หากเว็บไซต์มีส่วนหัวของโฮสต์มากกว่าหนึ่งรายการซึ่งเป็นจริงในเซิร์ฟเวอร์สดของเรา เห็นได้ชัดว่าบริการ WCF ที่โฮสต์ใน IIS สามารถมีฐานที่อยู่เดียวเท่านั้น ฉันจะแก้ไขปัญหานี้ได้อย่างไร

คำตอบ:


167

ใน. Net 4 คุณสามารถใช้multipleSiteBindingsEnabledตัวเลือก:

<system.serviceModel>
    <serviceHostingEnvironment multipleSiteBindingsEnabled="true">
    </serviceHostingEnvironment>
</system.serviceModel>

จากนั้นคุณไม่ต้องระบุที่อยู่แต่ละรายการ

http://msdn.microsoft.com/en-us/library/system.servicemodel.servicehostingenvironment.multiplesitebindingsenabled.aspx


ใช่ แต่ใช้งานได้กับ. NET 4.0 ขึ้นไปเท่านั้น ไม่สามารถใช้กับเว็บไซต์. NET 2.0 / 3.0 / 3.5
Bytemaster

2
หมายเหตุ - มีการพิมพ์ผิดที่นี่ - ไม่มีการปิด> ดังนั้นหากคุณคัดลอกและวางคุณจะมีปัญหา
sydneyos

2
ไม่สามารถใช้งานได้สำหรับคำถามนี้: "ฟังก์ชั่นนี้ใช้ได้เฉพาะกับโปรโตคอล HTTP เท่านั้น"
George Tsiokos

146

สรุป,

การแก้ปัญหารหัส: ที่นี่

โซลูชันการกำหนดค่า: ที่นี่

ด้วยความช่วยเหลือของMike Chaliyฉันได้พบวิธีแก้ไขปัญหาบางอย่างเกี่ยวกับวิธีการทำผ่านรหัส เนื่องจากปัญหานี้จะส่งผลกระทบต่อโครงการทั้งหมดที่เราปรับใช้กับสภาพแวดล้อมแบบสดที่ฉันจัดไว้สำหรับโซลูชันการกำหนดค่าอย่างหมดจด ในที่สุดฉันก็พบหนึ่งซึ่งมีรายละเอียดวิธีการทำใน. net 3.0 และ. net 3.5

นำมาจากเว็บไซต์ด้านล่างเป็นตัวอย่างของวิธีการปรับแต่งเว็บแอปพลิเคชันของคุณ:

<system.serviceModel>
    <serviceHostingEnvironment>
        <baseAddressPrefixFilters>
            <add prefix="net.tcp://payroll.myorg.com:8000"/>
            <add prefix="http://shipping.myorg.com:9000"/>
        </baseAddressPrefixFilters>
    </serviceHostingEnvironment>
</system.serviceModel>

ในตัวอย่างข้างต้น net.tcp: //payroll.myorg.com: 8000 และ http://shipping.myorg.com:9000เป็นที่อยู่ฐานเดียวสำหรับโครงร่างที่เกี่ยวข้องซึ่งจะได้รับอนุญาตให้ผ่านได้ baseAddressPrefixFilter ไม่รองรับอักขระตัวแทนใด ๆ

baseAddresses ที่จัดทำโดย IIS อาจมีที่อยู่ที่ถูกผูกไว้กับโครงร่างอื่น ๆ ที่ไม่มีอยู่ในรายการ baseAddressPrefixFilter ที่อยู่เหล่านี้จะไม่ถูกกรองออก

วิธีการแก้ปัญหา Dns (ยังไม่ทดลอง): ฉันคิดว่าถ้าคุณสร้างรายการ dns ใหม่โดยเฉพาะสำหรับเว็บแอปพลิเคชันของคุณเพิ่มเว็บไซต์ใหม่และให้ส่วนหัวของโฮสต์เดียวที่ตรงกับรายการ dns คุณจะลดปัญหานี้โดยสิ้นเชิง ต้องเขียนโค้ดที่กำหนดเองหรือเพิ่มคำนำหน้าให้กับไฟล์ web.config ของคุณ


2
การเพิ่มตัวกรองคำนำหน้าที่อยู่ฐานไปยัง web.config ทำงานได้อย่างสมบูรณ์ ขอบคุณ Jeremy!
Mike737

2
ฉันไม่สามารถคิดเหตุผลใดทำไมอยากข้อ จำกัด ดังกล่าวมากน้อยตั้งค่าเริ่มต้น ...
PBZ

42
ฉันเริ่มคิดที่ไม่ดีเกี่ยวกับ WCF ร่วมกับ ASP.net และบริการเว็บที่เข้าถึงผ่าน JavaScript ฉันมีปัญหามากน้อยธรรมดาบริการ ASMX เก่า ...
Juri

ตกลงถ้าคุณมีเว็บไซต์ที่มีแอปพลิเคชั่น. net 4 และ. net 2 รวมอยู่ด้วย ฐานของแอปพลิเคชันคือ. net4 และมีหลายแอปพลิเคชันที่จำเป็นต้องใช้. net2 คุณใช้ <serviceHostingEnvironment multipleSiteBindingsEnabled = "true"> ในไฟล์. net4 และคำนำหน้าทั้งหมดในแอปพลิเคชัน. net 2 หรือไม่
เทรวิส

59

คุณเห็นสิ่งนี้ - http://kb.discountasp.net/KB/a799/error-accessing-wcf-service-this-collection-already.aspx

คุณสามารถแก้ไขข้อผิดพลาดนี้ได้โดยเปลี่ยนไฟล์ web.config

ด้วย ASP.NET 4.0 ให้เพิ่มบรรทัดต่อไปนี้ในเว็บของคุณ config:

<system.serviceModel> 
     <serviceHostingEnvironment multipleSiteBindingsEnabled="true" /> 
</system.serviceModel> 

ด้วย ASP.NET 2.0 / 3.0 / 3.5 ให้เพิ่มบรรทัดต่อไปนี้ใน web.config ของคุณ:

<system.serviceModel> 
     <serviceHostingEnvironment> 
          <baseAddressPrefixFilters> 
               <add prefix="http://www.YourHostedDomainName.com"/> 
          </baseAddressPrefixFilters> 
     </serviceHostingEnvironment> 
</system.serviceModel> 

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

16

ในกรณีของฉันสาเหตุของปัญหานี้คือการผูก http หลายที่กำหนดไว้ที่เว็บไซต์แม่เช่น InetMgr-> Sites-> Mysite-> Properties-> EditBindings ฉันลบการรวม http หนึ่งรายการซึ่งไม่จำเป็นและปัญหาได้รับการแก้ไข


1
ใช่ Amar สิ่งนี้มีประโยชน์มาก - ในกรณีของฉันมันเป็นเว็บไซต์อีกแห่งที่มีการผูกหลายอย่างที่ทำให้มันแตก มีอยู่ภายนอกบนเครื่องเดียวกัน (แต่มีชื่อโฮสต์อื่น) สามารถแก้ไขได้ด้วยการเพิ่มการตั้งค่า multipleSiteBindingsEnabled แต่ web.config จะแตกต่างจากสภาพแวดล้อมอื่น ๆ ทั้งหมด
Coder

2
มันเป็นความอัปยศที่อยู่ด้านล่าง ในกรณีของเรานี้แก้ไขสำหรับเรา
brendonparker

มันช่วยให้ฉันทำซ้ำข้อผิดพลาดในสภาพแวดล้อมการพัฒนา ฉันไม่สามารถแก้ไขการเชื่อมโยงเว็บไซต์ในการรับรองหรือสภาพแวดล้อมแบบสด ฉันได้เปลี่ยนไฟล์โฮสต์ของฉันเพื่อจำลองโดเมนและเพิ่มการเชื่อมโยงไปยัง IIS ในพื้นที่และแบม!
MFedatto

8

และในกรณีของฉันมันง่าย: ฉันใช้ตัวช่วยสร้าง 'เพิ่มบริการ WCF' ใน Visual Studio ซึ่งสร้างส่วนที่เกี่ยวข้องใน app.config โดยอัตโนมัติ แล้วผมไปอ่านวิธีการ: โฮสต์บริการ WCF ในแอพลิเคชันที่มีการจัดการ ปัญหาคือ: ฉันไม่จำเป็นต้องระบุ URL เพื่อเรียกใช้บริการเว็บ

แทนที่:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService), baseAddress))

ด้วย:

using (ServiceHost host = new ServiceHost(typeof(HelloWorldService))

และข้อผิดพลาดก็หายไป

แนวคิดทั่วไป: หากคุณระบุที่อยู่พื้นฐานเป็นพารามิเตอร์และระบุในการกำหนดค่าคุณจะได้รับข้อผิดพลาดนี้ ส่วนใหญ่อาจไม่ใช่วิธีเดียวที่จะได้รับข้อผิดพลาดเจ้า


แก้ไขปัญหาของฉัน
QShengyao

2

ฉันมีปัญหานี้และสาเหตุก็ค่อนข้างโง่ ฉันลองใช้การสาธิตของ Microsoft เกี่ยวกับการเรียกใช้ ServiceHost จาก w / ในบรรทัดคำสั่งที่ปฏิบัติการได้ ฉันทำตามคำแนะนำรวมถึงที่แจ้งว่าจะเพิ่มบริการที่เหมาะสม (และส่วนต่อประสาน) แต่ฉันได้รับข้อผิดพลาดด้านบน

ปรากฎเมื่อฉันเพิ่มคลาสบริการ VS เพิ่มการกำหนดค่าลงใน app.config โดยอัตโนมัติ และตัวอย่างก็พยายามเพิ่มข้อมูลนั้นด้วย เนื่องจากมันอยู่ในการกำหนดค่าฉันจึงลบส่วนการสาธิตและใช้งานได้


0

ฉันมาด้วยข้อผิดพลาดเดียวกันใน Exchange Server เก่า บริการ (บริการการจำลองแบบ Exchange กล่องจดหมาย) ได้ให้ข้อผิดพลาดข้างต้นและกระบวนการโยกย้ายไม่สามารถดำเนินการต่อ ค้นหาผ่านอินเทอร์เน็ตฉันมาที่ลิงค์นี้ซึ่งระบุด้านล่าง:

Exchange GRE ล้มเหลวในการเปิดเมื่อติดตั้งเป็นครั้งแรกหรือหากมีการเปลี่ยนแปลงใด ๆ กับเซิร์ฟเวอร์ IIS มันล้มเหลวด้วยข้อผิดพลาดสแนปอินและเมื่อคุณพยายามเปิดหน้าสแน็ปอินเนื้อหาต่อไปนี้จะปรากฏขึ้น:

This collection already contains an address with scheme http.  There can be at most one address per scheme in this collection. If your service is being hosted in IIS you can fix the problem by setting 'system.serviceModel/serviceHostingEnvironment/multipleSiteBindingsEnabled' to true or specifying 'system.serviceModel/serviceHostingEnvironment/baseAddressPrefixFilters'."

สาเหตุ : ข้อผิดพลาดนี้เกิดขึ้นเนื่องจากหมายเลขพอร์ต HTTP 443 มีการใช้งานแล้วโดยแอปพลิเคชันอื่นและเซิร์ฟเวอร์ IIS ไม่ได้รับการกำหนดค่าให้จัดการการรวมหลายรายการเข้ากับพอร์ตเดียวกัน

การแก้ไข : กำหนดค่าเซิร์ฟเวอร์ IIS เพื่อจัดการการผูกหลายพอร์ต ติดต่อผู้จำหน่าย (Microsoft) เพื่อกำหนดค่า

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

การแก้ไขการเชื่อมโยงที่ถูกต้องช่วยแก้ปัญหาในกรณีของฉันและฉันไม่จำเป็นต้องกำหนดค่า Web.Config

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