Lỗi WCF - Không thể tìm thấy phần tử điểm cuối mặc định tham chiếu đến hợp đồng 'UserService.UserService'


98

Bất kỳ ý tưởng làm thế nào để sửa lỗi này?

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>

Không thể tìm thấy phần tử điểm cuối mặc định tham chiếu đến hợp đồng 'UserService.UserService' trong phần cấu hình máy khách ServiceModel. Điều này có thể là do không tìm thấy tệp cấu hình nào cho ứng dụng của bạn hoặc vì không tìm thấy phần tử điểm cuối phù hợp với hợp đồng này trong phần tử máy khách.

Đã giải quyết!

Tôi không đề cập rằng đây là một ứng dụng Silverlight. Tôi đã có tham chiếu wcf trong một DLL có tệp "ServiceRefferences.ClientConfig" của riêng nó. Tôi đã chuyển nội dung của ServiceRefferences.ClientConfig của DLL sang dự án silverlight chính và nó đã hoạt động.


Điều gì sẽ xảy ra nếu ứng dụng chạy DLL là của bên thứ ba, ví dụ: DLL là một plugin cho một ứng dụng khác?
Stefanos Kargas

Câu trả lời:


186

Tôi đã gặp phải vấn đề tương tự. Ứng dụng của tôi cũng là ứng dụng Silverlight và dịch vụ đang được gọi từ một thư viện lớp với UserControl tùy chỉnh đang được sử dụng trong đó.

Giải pháp rất đơn giản. Sao chép các định nghĩa điểm cuối từ tệp cấu hình (ví dụ: ServiceRefferences.ClientConfig) của thư viện lớp vào tệp cấu hình của ứng dụng silverlight. Tôi biết bạn mong đợi nó hoạt động mà không cần phải làm điều này, nhưng có vẻ như ai đó ở Redmond đã có một kỳ nghỉ vào ngày hôm đó.


50
Giải pháp này cũng hợp lệ cho các dự án ASP.NET và MVC. Nếu bạn thêm dịch vụ vào Thư viện lớp, nó sẽ không hoạt động tốt, hãy lấy phần system.serviceModel từ app.config trong dự án thư viện của bạn và đặt nó vào web.config của bạn.
Adam Pope

5
Có vẻ như điều này đúng với bất kỳ loại dự án nào, tôi đã sử dụng quartz.net làm dịch vụ windows và có một công việc trên một lắp ráp khác đang tham chiếu đến dịch vụ web. Nó cũng làm việc cho tôi. Cám ơn.
thiagoleite

2
Xin chào, nó cũng hoạt động cho một dự án Windows Phone. Như @thiagoleite nói, có vẻ như nó hoạt động cho hầu hết các loại dự án.
Thanushka,

3
+1 cho trò đùa trong kỳ nghỉ của Redmond ... Dù sao, có cách nào để thêm nó làm tệp bên ngoài thay vì chơi với web.config?
Shimmy Weitzhandler,

1
@sprite Tôi đã kết thúc việc thiết lập cài đặt cần thiết của mình trong mã (tôi đã ghi đè hàm tạo máy khách), như câu trả lời của Vishal . Bằng cách này, nó được vận chuyển qua các tổ hợp. Cảm ơn!
Shimmy Weitzhandler

45

Bạn cũng có thể đặt các giá trị này theo chương trình trong thư viện lớp, điều này sẽ tránh sự di chuyển không cần thiết của các tệp cấu hình trong thư viện. Mã ví dụ cho BasciHttpBinding đơn giản là:

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, thư viện lớp của tôi chỉ có tham chiếu đến wsdl. Tôi nên đặt mã này ở đâu? Tôi xây dựng nó thành một dll C # và đặt dll vào các tệp ứng dụng của mình, nơi tôi tham khảo nó từ IronPython. Cảm ơn bạn
Срба

12

Đề phòng trường hợp có ai gặp phải vấn đề tương tự khi sử dụng WPF (thay vì WCF hoặc Silverlight):

Tôi đã gặp lỗi này khi kết nối với Dịch vụ Web. Khi mã của tôi ở trong giải pháp Ứng dụng WPF "chính", không có vấn đề gì, nó hoạt động hoàn hảo. Nhưng khi tôi chuyển mã sang giải pháp lớp DAL hợp lý hơn, nó sẽ ném ra ngoại lệ.

Không thể tìm thấy phần tử điểm cuối mặc định tham chiếu hợp đồng 'MyWebService.MyServiceSoap' trong phần cấu hình máy khách ServiceModel. Điều này có thể là do không tìm thấy tệp cấu hình nào cho ứng dụng của bạn hoặc vì không tìm thấy phần tử điểm cuối phù hợp với hợp đồng này trong phần tử máy khách.

Như đã được "Sprite" nêu trong chủ đề này, bạn cần sao chép thẻ theo cách thủ công.

Đối với các ứng dụng WPF, điều này có nghĩa là sao chép thẻ từ app.config trong giải pháp DAL của tôi sang app.config trong giải pháp Ứng dụng WPF chính.


điều này thật tuyệt, nhưng sẽ tốt hơn nếu là một bình luận ngắn dưới câu trả lời của riêng tôi, giống như "Adam Pope" đã làm. Nó sẽ được nhiều người đọc hơn.
sprite

2
@sprite: Tôi đã thêm một nhận xét, nhưng các nhận xét của StackOverflow luôn được hiển thị dưới dạng một đoạn văn dài. Đối với một câu trả lời dài 5 đoạn như của tôi, điều đó sẽ dẫn đến một đoạn dài, khó đọc, không thân thiện. Viết một phản ứng riêng biệt cho phép tôi đưa ra một câu trả lời rõ ràng hơn, trong đó có nhiều khả năng để giúp đỡ những người dùng khác (trong đó, chúng ta hãy đối mặt với nó, là điểm của các trang web như thế này)
Mike Gledhill

6

Tôi đã gặp phải vấn đề tương tự, vì bất kỳ lý do gì Visual Studio không cập nhật cấu hình web khi tôi thêm dịch vụ lần đầu. Tôi thấy rằng việc cập nhật Tham chiếu dịch vụ cũng đã khắc phục được sự cố này.

Các bước:

  1. Điều hướng đến Thư mục Tham chiếu Dịch vụ
  2. Mở rộng nó
  3. Nhấp chuột phải và chọn bản cập nhật Tham chiếu dịch vụ
  4. Quan sát cấu hình web được cập nhật

Vâng, điều này đã làm một mẹo cho tôi. Tôi đang sử dụng tham chiếu dịch vụ wsdl của bên thứ 3 và gặp lỗi này cho đến khi tôi cập nhật tham chiếu Dịch vụ
ejhost

Cho tôi nữa. Đó là điều hiển nhiên vì nó hoạt động tốt và đột nhiên không. Tôi có thể đã thay đổi và không cập nhật tham chiếu dịch vụ.
ehh

4

Thay đổi web.config của dịch vụ WCF thành "endpoint address =" "bind =" basicHttpBinding "..." (trước đó ràng buộc = "wsHttpBinding") Sau khi xây dựng ứng dụng, trong cấu hình "ServiceRef Conference.ClientConfig" ""> có giá trị . Sau đó, nó sẽ hoạt động tốt.


3

Đổi tên output.config do svcutil.exe tạo thành app.config. nó đã làm việc cho tôi.


2

Bạn có Giao diện mà lớp "UserService" của bạn triển khai không.

Các điểm cuối của bạn phải chỉ định một giao diện cho thuộc tính hợp đồng:

contract="UserService.IUserService"

1

Không chắc chắn nếu đây là một vấn đề. Điểm cuối và ràng buộc đều có cùng tên


1

Không chắc đó có thực sự là vấn đề hay không, nhưng tôi thấy bạn có cùng tên cho cấu hình ràng buộc của mình ().

Tôi thường cố gắng gọi các điểm cuối của mình như "UserServiceBasicHttp" hoặc một cái gì đó tương tự ("Ràng buộc" thực sự không có bất cứ điều gì để làm ở đây) và tôi cố gắng gọi cấu hình ràng buộc của mình là ".... Cấu hình", ví dụ: "UserServiceDefaultBinding", để tránh mọi xung đột tên tiềm ẩn.

Marc


0

Phải thêm dịch vụ vào tệp App.config đang gọi để nó hoạt động. Hãy chắc chắn rằng bạn nhưng nó sau khi tất cả. Điều này dường như làm việc cho tôi.


0

Sự cố này xảy ra khi bạn sử dụng dịch vụ của mình thông qua ứng dụng khác. Nếu ứng dụng có tệp cấu hình, chỉ cần thêm thông tin cấu hình dịch vụ của bạn vào tệp này. Trong tình huống của tôi, không có bất kỳ tệp cấu hình nào nên tôi sử dụng kỹ thuật này và nó hoạt động tốt. Chỉ cần lưu trữ địa chỉ url trong ứng dụng, đọc nó và sử dụng phương thức BasicHttpBinding () gửi nó đến ứng dụng dịch vụ dưới dạng tham số. nó:

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

Đối với những người làm việc với các dịch vụ AIF của AX 2012 và cố gắng gọi dự án C # hoặc VB bên trong AX (x ++) và mắc phải các lỗi như "không thể tìm thấy điểm cuối mặc định" ... hoặc "không tìm thấy hợp đồng" ... hãy quay lại vào dự án studio trực quan (c #) của bạn và thêm các dòng này trước khi xác định máy khách dịch vụ của bạn, sau đó triển khai dự án và khởi động lại máy khách AX và thử lại: Lưu ý, ví dụ là đối với bộ điều hợp NetTcp , bạn có thể dễ dàng sử dụng bất kỳ bộ điều hợp nào khác thay thế theo nhu cầu của mình .

 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

Trong trường hợp nếu bạn đang sử dụng ứng dụng WPF bằng khuôn khổ PRISM thì cấu hình sẽ tồn tại trong dự án khởi động của bạn (tức là trong dự án nơi bootstrapper của bạn cư trú.)

Trong ngắn hạn, chỉ cần xóa nó khỏi thư viện lớp và đưa vào một dự án khởi động.

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.