ไม่พบองค์ประกอบจุดสิ้นสุดเริ่มต้น


369

ฉันได้เพิ่มพร็อกซีไปยังเว็บเซอร์วิซในโซลูชัน VS2008 / .NET 3.5 เมื่อสร้างไคลเอนต์. NET พ่นข้อผิดพลาดนี้:

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

การค้นหาข้อผิดพลาดนี้บอกให้ฉันใช้เนมสเปซเต็มรูปแบบในสัญญา นี่คือแอปของฉันกำหนดค่าด้วยเนมสเปซเต็มรูปแบบ:

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" bindingConfiguration="IMySOAPWebServicebinding"
            contract="Fusion.DataExchange.Workflows.IMySOAPWebService" name="IMySOAPWebServicePort" />
</client>

ฉันใช้ XP ในเครื่อง (ฉันพูดถึงสิ่งนี้เนื่องจากมี Google จำนวนหนึ่งที่กล่าวถึง win2k3) app.config ถูกคัดลอกไปยัง app.exe.config ดังนั้นจึงไม่ใช่ปัญหา

เบาะแสใด ๆ


หากสิ่งนี้กำลังทำงานอยู่บนเว็บเซิร์ฟเวอร์คุณจะต้องเพิ่ม. svc ตัวอย่าง: " 192.168.100.87:7001/soap/IMySOAPWebService.svc
Darren C

บริการนี้ไม่ใช่บริการ. NET แต่ไม่ได้ทำงานบนเว็บเซิร์ฟเวอร์
edosoft

ฉันแก้ไขปัญหานี้ในโครงการที่พัฒนาใน. NET แต่ฉันมีบางโครงการใน VB6 และฉันมีปัญหาเดียวกัน ความคิดใด ๆ
Gabriel Intriago

คำตอบ:


588

"ข้อผิดพลาดนี้อาจเกิดขึ้นหากคุณกำลังเรียกใช้บริการในไลบรารีคลาสและเรียกไลบรารีคลาสจากโครงการอื่น"

ในกรณีนี้คุณจะต้องรวมการตั้งค่าการกำหนดค่า WS ลงใน app.config โครงการหลักหากเป็น winapp หรือ web.config หากเป็นเว็บแอป นี่เป็นวิธีที่จะไปได้ด้วย PRISM และ WPF / Silverlight


1
นี่ไม่ใช่สาเหตุของปัญหาเฉพาะของฉัน แต่ฉันแน่ใจว่านี่จะช่วยผู้อื่น ขอบคุณ
edosoft

9
มีวิธีใดบ้างที่จะรวมทั้งสองเข้าด้วยกันโดยอัตโนมัติ จะทำอย่างไรถ้าไลบรารีคลาสอัพเดตการกำหนดค่า คุณเพิ่งติดขัดในการอัปเดตข้อมูลการกำหนดค่าที่คัดลอกในทุกโครงการที่อ้างถึงหรือไม่ การแก้ไขนี้ดูเหมือนว่าจะพึ่งพามากเกินไปในการระมัดระวังของนักพัฒนา ...
ฌอนแฮนลีย์

1
ฉันได้รับข้อผิดพลาดเดียวกันสำหรับแอป WP7 (ฉันเชื่อว่า Silverlight) และใช้เวลานานเกินไปที่ฉันจะสังเกตเห็นว่าServiceReferences.ClientConfigสร้างขึ้นในไดเรกทอรีโครงการ การคัดลอก<bindings>และ<client>องค์ประกอบจากไฟล์ในห้องสมุดของฉันไปยังแอพหลักของฉัน (ซึ่งก่อนหน้านี้ว่างเปล่า) ทำให้สิ่งต่าง ๆ ทำงานได้
David Mason

4
เหตุผลนี้เกิดขึ้น (เท่าที่ฉันเข้าใจ) นั่นคือค่าการอ่านจากโครงการหลักในการแก้ปัญหาไม่ว่าจะเป็นเว็บ winforms, wpf เป็นต้นพูดเช่นคุณมีโครงการห้องสมุดคลาสเพื่อเข้าถึงฐานข้อมูลรายการ connectionString จะต้องอยู่ในการกำหนดค่าโครงการหลักแทนการกำหนดค่าไลบรารีคลาส
Ciaran Bruen

6
ดังนั้นเราสามารถสรุปได้ว่าถ้าเราใช้ WCF ในห้องสมุดมันจะเป็นการดีกว่าถ้าหากตั้งค่าโค้ดโดยตรงเช่นลิงค์ stackoverflow.com/questions/7688798/…แสดง
ยอง

90

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

var remoteAddress = new System.ServiceModel.EndpointAddress(_webServiceUrl);

using (var productService = new ProductClient(new System.ServiceModel.BasicHttpBinding(), remoteAddress))
{
    //set timeout
    productService.Endpoint.Binding.SendTimeout = new TimeSpan(0,0,0,_webServiceTimeout);

    //call web service method
    productResponse = productService.GetProducts();
} 

แก้ไข

หากคุณกำลังใช้ https แล้วคุณจะต้องใช้มากกว่าBasicHttpsBindingBasicHttpBinding


1
นี่คือคำตอบที่เป็นประโยชน์ บนบริการเว็บที่ฉันใช้ปลายทางที่กำหนดเองจะต้องถูกผูกไว้ในการประกาศเริ่มต้นของวัตถุ มันจะไม่ทำงานถ้าฉันพยายามจะทำในภายหลัง
พอลมอเรล

2
เท่าที่ฉันสงสัยว่าคำตอบยอดนิยมอาจทำเคล็ดลับเกินไปวิธีการแก้ปัญหาของคุณทำงานและดูเหมือนว่าฉันแฮ็คร่วมกันไฟล์ config ของฉันเอง
แซมฉันพูดว่า Reinstate Monica

ใช้เสน่ห์ได้! ฉันชอบที่จะสามารถตั้งค่าจุดปลายในรหัสแทนที่จะกระจายไฟล์ "app.config" กับแอพของฉัน
Daniel Gee

1
ถ้าเป็นบริการเว็บ Https อย่าลืมเปลี่ยน BasicHttpBinding () เป็น BasicHttpsBinding ()
Anthony

วิธีนี้เหมาะสำหรับแอปพลิเคชันเช่น EXCEL-DNA ซึ่งไม่มี app.config หรือ web.config
user781700

75

หลังจากทดสอบตัวเลือกหลายตัวในที่สุดฉันก็แก้ปัญหานี้โดยใช้

สัญญา = "IMySOAPWebService"

เช่นไม่มีเนมสเปซเต็มรูปแบบในการกำหนดค่า ด้วยเหตุผลบางอย่างชื่อเต็มไม่สามารถแก้ไขได้อย่างถูกต้อง


3
ดูเหมือนว่าชื่อสัญญานั้นจะต้องถูกเขียนในลักษณะเดียวกับลูกค้า ในกรณีของฉันฉันมีvar proxy = new ExternalServices.ServiceClient("MyServiceEndpoint");มันทำงานเมื่อฉันเพิ่ม namespace เพื่อสัญญา:contract="ExternalServices.IMyService"
Anatoly Mironov

มันไม่ได้ผลสำหรับฉัน ปัญหาของฉันอาจแตกต่างกันเล็กน้อย ฉันได้รับข้อผิดพลาดนี้เป็นครั้งคราวไม่เสมอไป สิ่งที่อาจเป็นปัญหา อาจเกิดข้อผิดพลาดได้ที่ด้านบริการหรือไม่ _ ขอบคุณ
อัลบาทรอส

57

ฉันมีปัญหาเดียวกันนี้ ปรากฎว่าสำหรับเว็บอ้างอิงคุณจะต้องระบุ URL เป็นพารามิเตอร์แรกให้กับตัวสร้าง:

new WebService.WebServiceSoapClient("http://myservice.com/moo.aspx");

สำหรับเว็บอ้างอิงสไตล์ใหม่คุณต้องระบุชื่อที่อ้างถึงรายการปลายทางในการกำหนดค่า:

new WebService.WebServiceSoapClient("WebServiceEndpoint");

ด้วยรายการที่สอดคล้องกันในWeb.configหรือApp.config:

<client>
      <endpoint address="http://myservice.com/moo.aspx"
        binding="basicHttpBinding" 
        bindingConfiguration="WebService"
        contract="WebService.WebServiceSoap"
        name="WebServiceEndpoint" />
    </client>
  </system.serviceModel>

ค่อนข้างยากที่จะลบการมองเห็นอุโมงค์ใน "มันทำงานในโปรแกรมรุ่นเก่า" ...


3
อ้า! สิ่งนี้แก้ไขได้สำหรับฉันฉันเพิ่งใช้ตัวสร้างเปล่าก่อนหน้านี้ซึ่งยังคงล้มเหลว: ใหม่ WebService.WebServiceSoapClient (); // fail
travis

โซลูตินนี้ใช้งานได้ !!! แต่ฉันอยากรู้ว่าทำไมจุดสิ้นสุดเริ่มต้นไม่ถูกโหลด? ความคิดใด ๆ กับสิ่งที่อาจเป็นสาเหตุ?
Dipti Mehta

@ Andomar ขออภัยที่จะนำเธรดเก่าขึ้นมา มีข้อได้เปรียบเหนือกว่า WebReference และ ServiceReference ผมคิดว่าน่าจะสะดวกมากขึ้นสำหรับฉัน แต่ ServiceReference เป็นเย็นสิ่งใหม่ผมคิดว่า ...
Kev

17

ฉันมีสถานการณ์เช่นนี้ที่ฉันมี

  • บริการ WCF โฮสต์อยู่ที่ใดที่หนึ่ง
  • โครงการหลัก
  • โครงการผู้บริโภคประเภท 'ไลบรารีคลาส' ซึ่งมีบริการอ้างอิงถึงบริการ WCF
  • โครงการหลักเรียกวิธีการจากโครงการผู้บริโภค

ตอนนี้โครงการผู้บริโภคมีการตั้งค่าที่เกี่ยวข้องทั้งหมดใน <system.serviceModel>แท็กของ app.config ของฉันมันยังคงโยนข้อผิดพลาดเดียวกับด้านบน

ทั้งหมดที่ฉันทำคือเพิ่มแท็กเดียวกัน<system.serviceModel>ลงในไฟล์ app.config ของโครงการหลักและในที่สุดเราก็ไปได้

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


1
เหมือนกัน. ค้นหา<system.serviceModel>ในห้องสมุดของคุณแล้วคัดลอกไปยังแอปพลิเคชันหลักของแอปพลิเคชันของคุณ เพียงแค่อีกอาการหนึ่งของ class Library app.configs ที่ไม่ได้ถูกอ่านในขณะใช้งาน ฉันใช้เวลานานมากในการชดเชยการกำกับดูแลนี้ (imo) ถ้าฉันต้องการให้ห้องสมุดอ่านมันเป็น config จากมันเป็น app.config ให้มัน มิฉะนั้นทำไมต้องมี app.config สำหรับไลบรารี่ชั้นแรก?
SteveCinq

15

"ข้อผิดพลาดนี้อาจเกิดขึ้นหากคุณกำลังเรียกใช้บริการในไลบรารีคลาสและเรียกไลบรารีคลาสจากโครงการอื่น"

"ในกรณีนี้คุณจะต้องรวมการตั้งค่า WS ไว้ใน app.config โครงการหลักหากเป็น winapp หรือ web.config หากเป็นเว็บแอปนี่คือวิธีที่จะใช้งานกับ PRISM และ WPF / Silverlight"

ใช่ แต่ถ้าคุณไม่สามารถเปลี่ยนโครงการหลัก (ตัวอย่างเช่น Orchard CMS) คุณสามารถเก็บการกำหนดค่าบริการ WCF ไว้ในโครงการของคุณได้

คุณต้องสร้างผู้ช่วยบริการด้วยวิธีการสร้างลูกค้า:

public static class ServiceClientHelper
{
    public static T GetClient<T>(string moduleName) where T : IClientChannel
    {
        var channelType = typeof(T);
        var contractType = channelType.GetInterfaces().First(i => i.Namespace == channelType.Namespace);
        var contractAttribute = contractType.GetCustomAttributes(typeof(ServiceContractAttribute), false).First() as ServiceContractAttribute;

        if (contractAttribute == null)
            throw new Exception("contractAttribute not configured");

        //path to your lib app.config (mark as "Copy Always" in properties)
        var configPath = HostingEnvironment.MapPath(String.Format("~/Modules/{0}/bin/{0}.dll.config", moduleName)); 

        var configuration = ConfigurationManager.OpenMappedExeConfiguration(new ExeConfigurationFileMap { ExeConfigFilename = configPath }, ConfigurationUserLevel.None);
        var serviceModelSectionGroup = ServiceModelSectionGroup.GetSectionGroup(configuration);

        if (serviceModelSectionGroup == null)
            throw new Exception("serviceModelSectionGroup not configured");

        var endpoint = serviceModelSectionGroup.Client.Endpoints.OfType<ChannelEndpointElement>().First(e => e.Contract == contractAttribute.ConfigurationName);
        var channelFactory = new ConfigurationChannelFactory<T>(endpoint.Name, configuration, null);
        var client = channelFactory.CreateChannel();
        return client;
    }
}

และใช้มัน:

using (var client = ServiceClientHelper.GetClient<IDefaultNameServiceChannel>(yourLibName)) {
                ... get data from service ...
            }

ดูรายละเอียดในบทความนี้


15

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

นี่คือสิ่งที่ฉันคัดลอกออกจากไฟล์กำหนดค่าของไลบรารีคลาสของฉันลงในไฟล์ปรับแต่งของแอปคอนโซลเพื่อรับข้อผิดพลาดที่บ้าคลั่งนี้สำหรับบริการที่ฉันเขียนว่า "TranslationServiceOutbound"

โดยทั่วไปคุณต้องการทุกอย่างภายในส่วนsystem.serviceModel :

  <system.serviceModel>
<bindings>
  <basicHttpBinding>
    <binding name="BasicHttpBinding_ITranslationServiceOutbound" />
  </basicHttpBinding>
</bindings>
<client>
  <endpoint address="http://MyHostName/TranslationServiceOutbound/TranslationServiceOutbound.svc"
    binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_ITranslationServiceOutbound"
    contract="TranslationService.ITranslationServiceOutbound" name="BasicHttpBinding_ITranslationServiceOutbound" />
</client>


14

อันนี้ทำให้ฉันบ้า

ฉันใช้ Silverlight 3 Prism (CAB) กับ WCF

เมื่อฉันเรียกใช้บริการ WCF ในโมดูล Prism ฉันได้รับข้อผิดพลาดเดียวกัน:

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

ปรากฎว่าการค้นหาในไฟล์. xap ของเชลล์สำหรับไฟล์ ServiceReferences.ClientConfig ไม่ใช่ในไฟล์ ServiceReferences.ClientConfig ของโมดูล ฉันเพิ่มปลายทางและเชื่อมโยงกับไฟล์ ServiceReferences.ClientConfig ที่มีอยู่ในแอปพลิเคชัน Silverlight Shell ของฉัน (เรียกว่าเป็นบริการ WCF ของตัวเอง)

จากนั้นฉันต้องสร้างแอป Shell ใหม่เพื่อสร้างไฟล์. xap ใหม่สำหรับโฟลเดอร์ ClientBin ของโครงการเว็บของฉัน

ตอนนี้รหัสบรรทัดนี้ใช้งานได้ในที่สุด:

MyServiceClient myService = new MyServiceClient();

11

ฉันได้รับข้อผิดพลาดนี้ภายในแอปพลิเคชัน ASP.NET ซึ่งมีการเพิ่มบริการ WCF ไปยังไลบรารีคลาสซึ่งจะถูกเพิ่มลงในแอปพลิเคชัน ASP.NET เป็นไฟล์. dll ที่อ้างอิงในโฟลเดอร์ช่องเก็บ เพื่อแก้ไขข้อผิดพลาดการตั้งค่าการกำหนดค่าในไฟล์ app.config ภายในไลบรารีคลาสที่อ้างอิงบริการ WCF ที่จำเป็นในการคัดลอกลงในการตั้งค่า web.config สำหรับไซต์ ASP.NET / แอพ


ในขณะที่คำตอบอื่น ๆ อาจอธิบายปัญหาเดียวกัน คำตอบนี้อธิบายสถานการณ์ที่แน่นอนของฉันและในที่สุดฉันก็เข้าใจปัญหา ขอบคุณสำหรับการบันทึกวันของฉัน
Wouter Vanherck

10

ฉันพบ (รวมถึงการคัดลอกไปยัง App.config ของ UI ของลูกค้าเมื่อฉันใช้อินเทอร์เฟซ Class Library) ฉันต้องนำหน้าชื่อการผูกด้วยชื่อของการอ้างอิงบริการ (ของฉันคือ ServiceReferenceด้านล่าง)

เช่น:

<endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_ISchedulerService"
      contract="ServiceReference.ISchedulerService" 
      name="BasicHttpBinding_ISchedulerService" />

แทนที่จะสร้างค่าเริ่มต้น:

<endpoint address="http://localhost:4000/ServiceName" binding="basicHttpBinding"
      bindingConfiguration="BasicHttpBinding_ISchedulerService"
      contract="ISchedulerService" 
      name="BasicHttpBinding_ISchedulerService" />

1
ฉันต้องทำสิ่งเดียวกัน ฉันไม่เข้าใจว่าทำไม
Brig

8

ฉันมีปัญหาเดียวกัน แต่การเปลี่ยนเนมสเปซสัญญาไม่ได้ผลสำหรับฉัน ดังนั้นฉันจึงลองอ้างอิงเว็บสไตล์. Net 2 แทนการอ้างอิงบริการ. Net 3.5 ที่ได้ผล

หากต้องการใช้การอ้างอิงเว็บใน Visual Studio 2008 ให้คลิกที่ 'เพิ่มบริการอ้างอิง' จากนั้นคลิก 'ขั้นสูง' เมื่อกล่องโต้ตอบปรากฏ ในการที่คุณจะพบตัวเลือกที่จะช่วยให้คุณใช้การอ้างอิงเว็บแทนการอ้างอิงบริการ


2
นี่คือสิ่งที่ฉันทำลงเอยด้วย ฉันหวังว่าปัญหานี้สมเหตุสมผลสำหรับฉัน
Jarrett Widman

สิ่งนี้ได้ผลกับฉันเช่นกัน ตอนนี้ฉันมีขยะพิเศษทั้งหมดในโซลูชันของฉัน (การตั้งค่าการตั้งค่าโฟลเดอร์อ้างอิงเว็บใหม่) โดยไม่มีเหตุผล จะต้องกลับมาอีกครั้งเมื่อฉันมีเวลามากขึ้น
Mike K

ตกลง ฉันมีปัญหาเดียวกันและแก้ไขโดยเปลี่ยนเป็นการอ้างอิงเว็บ
Stephen Hosking

7

หน่วยทดสอบแอปพลิเคชันที่ไม่ใช่ห้องสมุดที่ใช้บริการอาจทำให้เกิดปัญหานี้

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

การเพิ่มบริการอ้างอิงไปยังโครงการทดสอบหน่วยแก้ไขปัญหาของฉัน


7

ฉันมีสถานการณ์ซึ่งในการทดสอบหน่วย ฉันคัดลอกไฟล์ app.config ไปยังโครงการทดสอบหน่วย ดังนั้นโครงการทดสอบหน่วยยังมีข้อมูลปลายทาง


2
ฉันไม่ได้คัดลอกแอพที่สมบูรณ์ตั้งค่า แต่system.serviceModelส่วน นั่นคือทั้งหมด!
kwrl

เหมือนกันยกเว้นฉันคัดลอกsystem.serviceModelไปยัง app.config ของแอปพลิเคชันคอนโซล
AlbatrossCafe

5

ฉันประสบปัญหานี้ครั้งเดียว เป็นเพราะฉันยังคงพัฒนาส่วนต่อประสานที่ใช้บริการ WCF ฉันกำหนดค่าแอปพลิเคชันทดสอบและการพัฒนาอย่างต่อเนื่อง จากนั้นในการพัฒนาฉันเปลี่ยนเนมสเปซบางอย่างของบริการ ดังนั้นฉันจึงเลือก "system.serviceModel -> client -> endpoint -> contract" ใน web.config เพื่อให้ตรงกับคลาส WCF จากนั้นปัญหาจะได้รับการแก้ไข


4

เนมสเปซในการกำหนดค่าของคุณควรสะท้อนถึงส่วนที่เหลือของเส้นทางเนมสเปซหลังจากเนมสเปซเริ่มต้นของลูกค้าของคุณ (ตามที่กำหนดค่าในคุณสมบัติโครงการ) จากคำตอบที่โพสต์ของคุณฉันเดาว่าลูกค้าของคุณได้รับการกำหนดค่าให้อยู่ในเนมสเปซ "Fusion.DataExchange.Workflows" หากคุณย้ายรหัสลูกค้าไปยังเนมสเปซอื่นคุณจะต้องอัปเดตการกำหนดค่าเพื่อให้ตรงกับเส้นทางเนมสเปซที่เหลืออยู่


3

ฉันมีปัญหาเดียวกันฉันใช้ WCF Service ในไลบรารีคลาสและเรียกไลบรารีคลาสจาก windows Application project.but ฉันลืมเปลี่ยน<system.serviceModel>ในไฟล์ Config ของแอปพลิเคชัน windows Project เหมือนกันกับ<system.serviceModel>ไฟล์ app.Config ของ Class Library
วิธีแก้ปัญหา: เปลี่ยนการกำหนดค่าของโครงการด้านนอกเหมือนกับการกำหนดค่า wcf ของไลบรารีคลาส


3

สวัสดีฉันพบปัญหาเดียวกัน แต่วิธีที่ดีที่สุดคือการให้. NET กำหนดค่าการกำหนดค่าฝั่งไคลเอ็นต์ของคุณ สิ่งที่ฉันค้นพบคือสิ่งนี้เมื่อฉันเพิ่มการอ้างอิงบริการด้วยสตริงการสืบค้นของ http: /namespace/service.svc? wsdl = wsdl0 มันไม่ได้สร้างจุดปลายทางการกำหนดค่าที่ฝั่งไคลเอ็นต์ แต่เมื่อฉันลบ? wsdl-wsdl0 และใช้ url http: /namespace/service.svc เท่านั้นมันจะสร้างการกำหนดค่าปลายทางที่ไฟล์กำหนดค่าไคลเอนต์ สำหรับ remoe สั้น ๆ "? WSDL = WSDL0"


3

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


3

ในกรณีที่คุณใช้ WPF application โดยใช้เฟรมเวิร์ก PRISM ควรมีการกำหนดค่าในโครงการเริ่มต้นของคุณ (เช่นในโครงการที่ bootstrapper ของคุณอยู่)


2

ข้อผิดพลาดนี้อาจเกิดขึ้นหากคุณกำลังเรียกใช้บริการในไลบรารีคลาสและเรียกไลบรารีคลาสจากโครงการอื่น


2

ดูเหมือนจะมีหลายวิธีในการสร้าง / แก้ไขปัญหานี้ สำหรับฉันผลิตภัณฑ์ CRM ที่ฉันใช้นั้นถูกเขียนด้วยรหัสเนทีฟและสามารถเรียกใช้ dll. NET ของฉันได้ แต่ฉันพบข้อมูลการกำหนดค่าที่ต้องอยู่ที่ / สูงกว่าแอปพลิเคชันหลัก สำหรับฉันแล้วแอปพลิเคชั่น CRM ไม่ใช่. NET ดังนั้นฉันต้องลงไปในไฟล์ machine.config (ไม่ใช่ตำแหน่งที่ฉันต้องการ) นอกจากนี้เนื่องจาก บริษัท ของฉันใช้ Websense ฉันมีเวลาที่ยากลำบากในการเพิ่มการอ้างอิงบริการเนื่องจากปัญหาการรับรองความถูกต้องของพร็อกซี 407 ซึ่งจำเป็นต้องมีการปรับเปลี่ยนไปยังเครื่องคอมพิวเตอร์

โซลูชันพรอกซี:

ในการรับ WCF Service Reference เพื่อทำงานฉันต้องคัดลอกข้อมูลจาก app.config ของ DLL ไปยังการตั้งค่าแอปพลิเคชันหลัก (แต่สำหรับฉันนั่นคือ machine.config) และฉันต้องคัดลอกข้อมูลจุดปลายไปยังไฟล์เดียวกัน เมื่อฉันทำอย่างนั้นมันเริ่มทำงานให้ฉัน


2

ตกลง. กรณีของฉันแตกต่างกันเล็กน้อย แต่ในที่สุดฉันก็ได้พบการแก้ไข: ฉันมี Console.EXE -> DLL -> เรียกใช้ WS1 -> DLL -> เรียกใช้ WS2

ฉันมีทั้งการกำหนดค่าของรูปแบบการบริการของ WS1 และ WS2 ใน Console.EXE.config ตามที่แนะนำ - ไม่ได้แก้ปัญหา

แต่มันก็ยังใช้งานไม่ได้จนกว่าฉันจะเพิ่มWebReference ของ WS2 ไปยัง WS1 ด้วยและไม่เพียง แต่กับ DLL ที่สร้างและเรียกใช้พร็อกซีของ WS2 จริงๆ


2

หากคุณอ้างอิงบริการเว็บในไลบรารีคลาสของคุณคุณต้องคัดลอก app.config ไปยังแอปพลิเคชัน windows หรือแอปพลิเคชันคอนโซลของคุณ

วิธีแก้ปัญหา: เปลี่ยนการกำหนดค่าของโครงการด้านนอกเหมือนกับการกำหนดค่า wcf ของไลบรารีคลาส

ทำงานให้ฉัน


2

ฉันมีปัญหาเดียวกัน
ฉันใช้แอพเดสก์ท็อปและใช้บริการเว็บพยากรณ์อากาศ

ฉันลบการอ้างอิงบริการและเพิ่มการอ้างอิงเว็บและแก้ไขปัญหาขอบคุณ


2

ทางออกสำหรับฉันคือการลบชื่อปลายทางจากแอตทริบิวต์ชื่อปลายทางในไคลเอนต์ web.config นี้อนุญาตให้ใช้พร็อกซี

ChannelFactory<TService> _channelFactory = new ChannelFactory<TService>("");

ใช้เวลาทั้งวันในการออกกำลังกายเท่านั้น ชื่อสัญญาผิดด้วยเมื่อแก้ไขนี้แล้วแม้ว่ามันจะผิดพลาดเมื่อข้อผิดพลาดเริ่มต้นปรากฏขึ้น ตรวจสอบสองครั้งแล้วสามครั้งสำหรับคนที่ชื่อสัญญาสตริง !! attrib: เอียน


2

ให้ฉันเพิ่มอีกหนึ่งอย่างเพื่อค้นหา ( Tom Haigh's)คำตอบได้กล่าวถึงแล้ว แต่ฉันต้องการชัดเจน)

web.configไฟล์ของฉันมีการกำหนดไว้ดังต่อไปนี้:

<protocolMapping>
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>

ฉันกำลังใช้ basicHttpsBinding สำหรับการอ้างอิงหนึ่งรายการ แต่จากนั้นฉันเพิ่มการอ้างอิงใหม่ที่ต้องการ basicHttpBinding (ไม่ใช่ s) สิ่งที่ฉันต้องทำคือเพิ่มลงในของฉันprotocolMappingดังนี้:

<protocolMapping>
    <add binding="basicHttpBinding" scheme="http" />
    <add binding="basicHttpsBinding" scheme="https" />
</protocolMapping>

เนื่องจากLRชี้ให้เห็นอย่างถูกต้องจำเป็นต้องกำหนดสิ่งนี้ในสถานที่ที่เหมาะสม สำหรับฉันนั่นหมายถึงหนึ่งใน app.config ของโครงการทดสอบหน่วยของฉันเช่นเดียวกับหนึ่งใน web.config ของโครงการบริการหลัก


2

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

กล่าวคือ

<endpoint contract="global::MyNamepsace.IMyContract" .../>

ทำงานได้ แต่

<endpoint contract="MyNamepsace.IMyContract" .../>

ให้ข้อผิดพลาด "ไม่พบองค์ประกอบปลายทางเริ่มต้นที่อ้างอิงสัญญา"

แอสเซมบลีที่ประกอบด้วย MyNamepsace.IMyContract อยู่ในแอสเซมบลีที่แตกต่างกันกับแอปพลิเคชันหลักดังนั้นนี่อาจอธิบายความจำเป็นในการใช้การแก้ปัญหาขอบเขตส่วนกลาง


2

เมื่อคุณเพิ่มการอ้างอิงบริการ

ป้อนคำอธิบายรูปภาพที่นี่

ระวังเนมสเปซที่คุณกำลังพิมพ์:

ป้อนคำอธิบายรูปภาพที่นี่

คุณควรต่อท้ายชื่ออินเตอร์เฟสของคุณ:

<client>
  <endpoint address="http://192.168.100.87:7001/soap/IMySOAPWebService"
            binding="basicHttpBinding" 
            contract="MyNamespace.IMySOAPWebService" />
</client>

2

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

<client>
    <endpoint address="https://xxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="ServiceReference.IIntegrationService" name="basic" />
</client>

โครงการ B:

<client>
    <endpoint address="xxxxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="ServiceReference1.IIntegrationService" name="basic" />
</client>

ในที่สุดฉันก็เปลี่ยนเป็นทั้ง:

<client>
    <endpoint address="https://xxxxxxxxxxx" binding="basicHttpBinding" bindingConfiguration="basic" contract="MyServiceReferrence.IIntegrationService" name="basic" />
</client>

1

ฉันมีปัญหาเดียวกันและแก้ไขได้ก็ต่อเมื่อแอปพลิเคชันโฮสต์และ dll ที่ใช้ปลายทางนั้นมีชื่ออ้างอิงบริการเดียวกัน

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