ข้อผิดพลาด WCF - ไม่พบองค์ประกอบปลายทางเริ่มต้นที่อ้างถึงสัญญา 'UserService.UserService'


98

มีความคิดอย่างไรในการแก้ไขปัญหานี้

UserService.UserServiceClient userServiceClient = new UserServiceClient();
            userServiceClient.GetUsersCompleted += new EventHandler<GetUsersCompletedEventArgs>(userServiceClient_GetUsersCompleted);
            userServiceClient.GetUsersAsync(searchString);

.

<system.serviceModel>
    <bindings>
        <basicHttpBinding>
            <binding name="BasicHttpBinding_UserService" 
                     maxBufferSize="2147483647" 
                     maxReceivedMessageSize="2147483647">
                <security mode="None" />
            </binding>
        </basicHttpBinding>
    </bindings>
    <client>
        <endpoint address="http://localhost:52185/UserService.svc" 
                  binding="basicHttpBinding" 
                  bindingConfiguration="BasicHttpBinding_UserService" 
                  contract="UserService.UserService"
                  name="BasicHttpBinding_UserService" />
    </client>
    <behaviors>
        <serviceBehaviors>
            <behavior name="Shell.Silverlight.Web.Service3Behavior">
                <serviceMetadata httpGetEnabled="true" />
                <serviceDebug includeExceptionDetailInFaults="false" />
            </behavior>
        </serviceBehaviors>
    </behaviors>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <services>
        <service behaviorConfiguration="Shell.Silverlight.Web.Service3Behavior" 
                 name="Shell.Silverlight.Web.Service3">
            <endpoint address="" 
                      binding="basicHttpBinding" 
                      contract="Shell.Silverlight.Web.Service3" />
            <endpoint address="mex" 
                      binding="mexHttpBinding" 
                      contract="IMetadataExchange" />
        </service>
    </services>
</system.serviceModel>

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

แก้ไขแล้ว!

ฉันไม่ได้พูดถึงว่านี่คือแอปพลิเคชั่น Silverlight ฉันมีการอ้างอิง wcf ใน DLL ซึ่งมีไฟล์ "ServiceReferences.ClientConfig" เป็นของตัวเอง ฉันย้ายเนื้อหาของ ServiceReferences.ClientConfig ของ DLL ไปยังโครงการ Silverlight หลักและใช้งานได้


จะเกิดอะไรขึ้นถ้าแอปพลิเคชันที่ใช้ DLL เป็นของบุคคลที่สามเช่น DLL เป็นปลั๊กอินสำหรับแอปพลิเคชันอื่น
Stefanos Kargas

คำตอบ:


186

ฉันประสบปัญหาเดียวกัน แอปพลิเคชันของฉันยังเป็นแอปพลิเคชัน Silverlight และมีการเรียกใช้บริการจากไลบรารีคลาสที่มี UserControl แบบกำหนดเองที่ใช้อยู่

วิธีแก้ก็ง่ายๆ คัดลอกนิยามปลายทางจากไฟล์กำหนดค่า (เช่น ServiceReferences.ClientConfig) ของไลบรารีคลาสไปยังไฟล์ config ของแอปพลิเคชัน silverlight ฉันรู้ว่าคุณคาดหวังให้มันใช้งานได้โดยไม่ต้องทำ แต่เห็นได้ชัดว่ามีคนในเรดมอนด์ได้พักร้อนในวันนั้น


50
โซลูชันนี้ใช้ได้กับโครงการ ASP.NET และ MVC เช่นกัน หากคุณเพิ่มบริการลงในไลบรารีคลาสมันจะไม่สามารถใช้งานได้ทันทีให้คว้าส่วน system.serviceModel จาก app.config ในโปรเจ็กต์ไลบรารีของคุณและวางไว้ใน web.config ของคุณ
Adam Pope

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

2
สวัสดีมันใช้งานได้กับโครงการ Windows Phone ด้วย ดังที่ @thiagoleite กล่าวว่าดูเหมือนว่าจะใช้ได้กับโครงการส่วนใหญ่
นุชกา

3
+1 สำหรับเรื่องตลกวันหยุดของ Redmond ... อย่างไรก็ตามมีวิธีเพิ่มเป็นไฟล์ภายนอกแทนที่จะเล่นกับไฟล์web.configหรือไม่?
Shimmy Weitzhandler

1
@sprite ฉันสิ้นสุดการตั้งค่าการตั้งค่าที่จำเป็นของฉันในรหัส (ผมเคยแทนที่ตัวสร้างลูกค้า) เช่นวิษณุของคำตอบ วิธีนี้จะได้รับการจัดส่งข้ามชุดประกอบ ขอบคุณ!
Shimmy Weitzhandler

45

คุณยังสามารถตั้งค่าเหล่านี้โดยทางโปรแกรมในไลบรารีคลาสซึ่งจะหลีกเลี่ยงการเคลื่อนย้ายไฟล์ config ข้ามไลบรารีโดยไม่จำเป็น โค้ดตัวอย่างสำหรับ BasciHttpBinding ง่ายๆคือ -

BasicHttpBinding basicHttpbinding = new BasicHttpBinding(BasicHttpSecurityMode.None);
basicHttpbinding.Name = "BasicHttpBinding_YourName";
basicHttpbinding.Security.Transport.ClientCredentialType = HttpClientCredentialType.None;
basicHttpbinding.Security.Message.ClientCredentialType = BasicHttpMessageCredentialType.UserName;

EndpointAddress endpointAddress = new EndpointAddress("http://<Your machine>/Service1/Service1.svc");
Service1Client proxyClient = new Service1Client(basicHttpbinding,endpointAddress);

@wooncherk ห้องสมุดชั้นเรียนของฉันมีเพียงการอ้างอิงถึง wsdl ฉันควรใส่รหัสนี้ไว้ที่ไหน? ฉันสร้างมันออกมาเป็น C # dll และใส่ dll ลงในไฟล์แอพของฉันโดยที่ฉันอ้างอิงจาก IronPython ขอบคุณ
Срба

12

ในกรณีที่มีใครพบปัญหาเดียวกันในขณะที่ใช้ WPF (แทนที่จะเป็น WCF หรือ Silverlight):

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

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

ตามที่ระบุไว้โดย "Sprite" ในชุดข้อความนี้คุณต้องคัดลอกแท็กด้วยตนเอง

สำหรับแอป WPF หมายถึงการคัดลอกแท็กจากapp.configในโซลูชัน DAL ของฉันไปยังapp.configในโซลูชัน WPF Application หลัก


นี่เป็นสิ่งที่ดี แต่จะดีกว่านี้หากแสดงความคิดเห็นสั้น ๆ ภายใต้คำตอบของฉันเองเหมือนที่ "Adam Pope" ทำ จะมีคนอ่านมากขึ้น
สไปรต์

2
@sprite: ฉันจะเพิ่มความคิดเห็น แต่ความคิดเห็น StackOverflow จะแสดงเป็นย่อหน้ายาว ๆ เสมอ สำหรับคำตอบ 5 ย่อหน้าเหมือนของฉันนั่นจะส่งผลให้มีหนึ่งย่อหน้าที่ยาวอ่านไม่ได้และไม่เป็นมิตร การเขียนคำตอบแบบแยกส่วนทำให้ฉันสามารถให้คำตอบที่ชัดเจนขึ้นซึ่งมีแนวโน้มที่จะช่วยผู้ใช้รายอื่นได้มากขึ้น (ซึ่งก็คือประเด็นของเว็บไซต์เช่นนี้)
Mike Gledhill

6

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

ขั้นตอน:

  1. ไปที่โฟลเดอร์อ้างอิงบริการ
  2. ขยายมัน
  3. คลิกขวาและเลือกอัปเดตข้อมูลอ้างอิงบริการ
  4. สังเกตเว็บ Config ได้รับการอัปเดต

ใช่นี่เป็นเคล็ดลับสำหรับฉัน ฉันใช้การอ้างอิงบริการ wsdl ของบุคคลที่สามและได้รับข้อผิดพลาดนี้จนกระทั่งฉันอัปเดตการอ้างอิงบริการ
ejhost

ให้ฉันด้วย. เห็นได้ชัดว่ามันใช้งานได้ดี แต่ก็ไม่เป็นเช่นนั้น ฉันอาจทำการเปลี่ยนแปลงและไม่ได้อัปเดตข้อมูลอ้างอิงของบริการ
เอ๊ะ

4

เปลี่ยน web.config ของบริการ WCF เป็น "endpoint address =" "binding =" basicHttpBinding "... " (previous binding = "wsHttpBinding") หลังจากสร้างแอปแล้วใน "ServiceReferences.ClientConfig" "" configuration> มีค่า . แล้วมันจะทำงานได้ดี


3

เปลี่ยนชื่อ output.config ที่สร้างโดย svcutil.exe เป็น app.config มันได้ผลสำหรับฉัน


2

คุณมีอินเทอร์เฟซที่คลาส "UserService" ของคุณใช้หรือไม่

จุดสิ้นสุดของคุณควรระบุอินเทอร์เฟซสำหรับแอตทริบิวต์สัญญา:

contract="UserService.IUserService"


1

ไม่แน่ใจว่าเป็นปัญหาจริงๆหรือเปล่า แต่ฉันเห็นว่าคุณมีชื่อเดียวกันสำหรับการกำหนดค่าการผูก ()

โดยปกติฉันจะพยายามเรียกจุดสิ้นสุดของฉันว่า "UserServiceBasicHttp" หรือสิ่งที่คล้ายกัน ("การเชื่อมโยง" ไม่มีอะไรเกี่ยวข้องเลย) และฉันพยายามเรียกการกำหนดค่าการผูกของฉันด้วย ".... Configuration" เช่น "UserServiceDefaultBinding" เพื่อหลีกเลี่ยงการขัดแย้งของชื่อที่อาจเกิดขึ้น

มาร์ค


0

ต้องเพิ่มบริการในการเรียกไฟล์ App.config เพื่อให้ใช้งานได้ ตรวจสอบให้แน่ใจว่าคุณได้ แต่หลังจากนั้น สิ่งนี้ดูเหมือนจะใช้ได้ผลสำหรับฉัน


0

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

Configuration config = new Configuration(dataRowSet[0]["ServiceUrl"].ToString());

var remoteAddress = new System.ServiceModel.EndpointAddress(config.Url);


SimpleService.PayPointSoapClient client = 
    new SimpleService.PayPointSoapClient(new System.ServiceModel.BasicHttpBinding(), 
    remoteAddress);
SimpleService.AccountcredResponse response = client.AccountCred(request);

0

สำหรับผู้ที่ทำงานกับบริการAIF ของ AX 2012และพยายามโทรไปที่นั่นโครงการC #หรือ VB ภายใน AX (x ++) และประสบกับข้อผิดพลาดของ"ไม่พบจุดสิ้นสุดเริ่มต้น" ... หรือ"ไม่พบสัญญา" ... ย้อนกลับ ไปยังโปรเจ็กต์ visual studio (c #) ของคุณและเพิ่มบรรทัดเหล่านี้ก่อนกำหนดเซอร์วิสไคลเอ็นต์ของคุณจากนั้นปรับใช้โปรเจ็กต์และรีสตาร์ทไคลเอนต์ AX และลองใหม่: หมายเหตุตัวอย่างนี้ใช้สำหรับอะแดปเตอร์ NetTcpคุณสามารถใช้อะแดปเตอร์อื่น ๆ แทนได้อย่างง่ายดายตามความต้องการของคุณ .

 Uri Address = new Uri("net.tcp://your-server:Port>/DynamicsAx/Services/your-port-name");
 NetTcpBinding Binding = new NetTcpBinding();
 EndpointAddress EndPointAddr = new EndpointAddress(Address);
 SalesOrderServiceClient Client = new SalesOrderServiceClient(Binding, EndPointAddr);

-2

ในกรณีที่คุณใช้แอปพลิเคชัน WPF โดยใช้กรอบงาน PRISM การกำหนดค่าควรมีอยู่ในโครงการเริ่มต้นของคุณ (เช่นในโครงการที่ bootstrapper ของคุณอยู่)

ในระยะสั้นเพียงแค่ลบออกจากไลบรารีชั้นเรียนและใส่ลงในโครงการเริ่มต้น

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