2010-01-16 32 views
36

Tôi tương đối mới đối với WCF. Tuy nhiên, tôi cần tạo một dịch vụ để lộ dữ liệu cho cả ứng dụng khách Silverlight và AJAX. Trong một nỗ lực để thực hiện điều này, tôi đã tạo ra các dịch vụ sau để phục vụ như một bằng chứng của khái niệm:WCF - Tên hợp đồng không thể tìm thấy trong danh sách hợp đồng

[ServiceContract(Namespace="urn:MyCompany.MyProject.Services")] 
public interface IJsonService 
{ 
    [OperationContract] 
    [WebInvoke(Method = "GET", 
       RequestFormat=WebMessageFormat.Json, 
       ResponseFormat = WebMessageFormat.Json)] 
    List<String> JsonFindNames(); 
} 

[ServiceContract(Namespace="urn:MyCompany.MyProject.Services")] 
public interface IWsService 
{ 
    [OperationContract(Name="FindNames")] 
    List<String> WsFindNames(); 
} 


[ServiceBehavior(Name="myService", Namespace="urn:MyCompany.MyProject.Services")] 
public class myService : IJsonService, IWsService 
{ 
    public List<String> JsonFindNames() 
     { return FindNames(); } 
    public List<String> WsFindNames() 
     { return FindNames(name); } 
    public List<string> FindNames() 
    { 
     List<string> names = List<string>(); 
     names.Add("Alan"); 
     names.Add("Bill"); 
     return results; 
    }   
} 

Khi tôi cố gắng truy cập vào dịch vụ này, tôi nhận được lỗi sau:

Tên hợp đồng ' myService 'không thể tìm thấy trong danh sách các hợp đồng được thực hiện bởi dịch vụ' myService '.

Nguyên nhân của việc này là gì? Làm thế nào để sửa lỗi này?

Cảm ơn bạn

Trả lời

55

Hợp đồng của bạn là Giao diện không thực hiện.

Một nơi nào đó trong cấu hình bạn đã viết myService thay vì IJsonService.

1

Tôi đã có cùng một vấn đề, nhưng giải pháp của tôi là trong web.config của tôi, tôi đã chỉ định toàn bộ tên lớp (bao gồm cả không gian tên), trong khi WCF chỉ chấp nhận tên lớp.

này đã không làm việc:

<services> 
    <service name="BusinessServices.Web.RfsProcessor"> 

này làm việc:

<services> 
    <service name="RfsProcessor"> 
+0

Tôi vừa xóa không gian tên của mình, cố gắng giải quyết vấn đề tương tự như OP và dịch vụ của tôi biến mất. – ProfK

+0

Điều này không đúng. Không gian tên là bắt buộc. Việc lắp ráp là ** không **. –

9

Tháo namespace từ tên dịch vụ. Nó sẽ hoạt động tốt.

3

Sửa đổi web.config của bạn Bạn có thể tìm <services> thẻ và dưới của thẻ này bạn phải có hai thẻ khác:

<service ....<endpoint ....

Trong <endpoint> tag bạn phải tham khảo để giao tiếp của lớp học của bạn.

Đối exampl: Nếu lớp dịch vụ của bạn được đặt tên CustomerSearch và giao diện của bạn tên là ICustomerSearch bạn phải cấu hình như thế này:

<service name="CustomerSearch" behaviorConfiguration="ServiceBehavior"> 
    <endpoint address="" binding="webHttpBinding" contract="ICustomerSearch" 
      behaviorConfiguration="ServiceAspNetAjaxBehavior"> 
0

Trong tập tin web.config, name thuộc tính <service phần tử cần phải được tên các loại dịch vụ với không gian tên, nhưng không phải là lắp ráp (Namespace1.Namespace2.Class). Thuộc tínhcủa phần tử contract tương tự có kiểu giao diện đủ điều kiện không gian tên - Namespace1.Namespace2.Interface.

Điều này cũng giải quyết tất cả hành vi shenanigans, như CreateBehavior không được gọi trên BehaviorExtensionElement.

0

Tôi đã gặp lỗi đó trước đó cho khung công tác ServiceModel 3.5 và tôi đã kiểm tra tệp cấu hình của máy chủ lưu trữ của mình. Tôi thấy đó là lỗi cắt và dán của tôi. Dịch vụ của tôi chỉ đến một dịch vụ không tồn tại cũ hơn dịch vụ tôi đang sử dụng.Nó bắt đầu hoạt động trở lại sau khi tôi sửa lại những dòng này như dưới đây:

<system.serviceModel> 
<services> 
    <!--<service name="NotUsed.Serv">--> 
    <service name="InUse.MyService"> 
    <host> 
     <baseAddresses> 
     <!--<add baseAddress="http://localhost:8181/LastService" />--> 
     <add baseAddress="http://localhost:8181/InUseService"/> 
     </baseAddresses> 
    </host> 
    </service> 
</services> 
</system.serviceModel> 

Lưu ý rằng MyService phải là tên của lớp hợp đồng của bạn trong ServiceModel 3.5 nhưng nó là IMyService giao diện hợp đồng trong Framework 4.0 ->

namespace InUse { 
[ServiceContract] 
public interface IMyService 
{ 
    [WebGet(UriTemplate = "/GetList/{PATTERN}", 
     RequestFormat = WebMessageFormat.Json, 
     ResponseFormat = WebMessageFormat.Json)] 
    [OperationContract] 
    List<string> GetIDListByPattern(string PATTERN); 

} 

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]  
public class MyService : IMyService 
{   
    List<string> MySample = (new _PointRT()).Sample().Select(r=>r._pointXID).ToList(); 

    public List<string> GetIDListByPattern(string PATTERN) { 
     return MySample.Where(x => x.Contains(PATTERN)).ToList(); 
    } 
} 
Các vấn đề liên quan