2012-07-05 30 views
6

hãy kiểm tra các ví dụ dưới đâyHai giao diện và một lớp bê tông trong WCF

namespace GServices 
{ 
    [ServiceKnownType(typeof(SearchType))] 
    [ServiceContract(SessionMode = SessionMode.Allowed)] 
    public interface ITest 
    { 
     [OperationContract] 
     int subtract(int x, int y); 
    } 

    [ServiceKnownType(typeof(SearchType))] 
    [ServiceContract(SessionMode = SessionMode.Allowed)] 
    public interface ITest2 
    { 
     [OperationContract] 
     int add(int x, int y); 

    } 
    public class G : ITest2, ITest 
    { 
     public int add(int x, int y) 
     { 
      return x + y; 
     } 
     public int subtract(int x, int y) 
     { 
      return x + y; 
     } 
    } 
} 

ITest có phương pháp trừ() và Itest2 có thêm phương pháp().

Cả hai đều được thực hiện bởi một lớp bê tông được gọi là G.

Nếu tôi chỉ muốn để lộ những ITest qua WCF, tôi đã sau endpoint cấu hình

<service name="GQS1" behaviorConfiguration="GQwcfBehaviour"> 
    <endpoint address="DP2Svcs" binding="wsHttpContextBinding" bindingConfiguration="wsHttpEndpointBindingConfig" contract="GServices.itest"> 
     <identity> 
     <dns value="localhost" /> 
     </identity> 
    </endpoint> 
    </service> 

khi tôi chạy dịch vụ này và kiểm tra wsdl , Tôi có thể thấy rằng các phương thức trong itest2 cũng xuất hiện trong wsdl. trong trường hợp ví dụ này, phương thức trừ() chỉ nên được hiển thị. Nhưng phương thức add() cũng được tiếp xúc.

Yêu cầu của tôi là phải có phương pháp trong Giao diện thông minh nhất chỉ nên hiển thị. trong trường hợp này, tôi muốn chỉ hiển thị phương thức trừ() được khai báo trong ITEST. Nhưng cả hai việc triển khai của họ đều nằm trong Chỉ một lớp cụ thể "G". Tôi đang thiếu gì ở đây?

Edit: tôi đã đưa nội dung tập tin Service.svc tôi:

<%@ ServiceHost Language="C#" Debug="true" Service="GServices.G" %> 

enter image description here

+0

Loại trả về của phương pháp tiếp xúc của bạn là 'G' hoặc' ITest' –

+0

@Bob: Không phải là 'int'? – abatishchev

+0

@abatishchev: ok, xin lỗi, tôi đã sao chép từ mã phát triển và đổi tên – amaz

Trả lời

4

Đảm bảo rằng giá trị của thuộc tính name trong phần tử <service> trong cấu hình là tên đủ điều kiện của lớp dịch vụ. Trong cấu hình của bạn, bạn có tên hợp đồng điểm cuối đủ điều kiện bởi một không gian tên (GServices.itest), nhưng dịch vụ không phải là (GQS1). Nếu bạn không có bất kỳ dịch vụ confugration cho một dịch vụ cụ thể, WCF sẽ thêm một điểm cuối mặc định mà wil phơi bày vấn đề bạn có. Ví dụ, trong đoạn mã dưới đây, nơi dòng mà thêm một điểm cuối được nhận xét, WSDL trên dịch vụ hiển thị cả hai hoạt động. Nhưng nếu bạn bỏ ghi chú dòng (mà sẽ làm cho dịch vụ chỉ có một điểm cuối của kiểu ITest), chỉ hoạt động "trừ" sẽ được hiển thị.

public class StackOverflow_11339853 
{ 
    [ServiceContract(SessionMode = SessionMode.Allowed)] 
    public interface ITest 
    { 
     [OperationContract] 
     int subtract(int x, int y); 
    } 

    [ServiceContract(SessionMode = SessionMode.Allowed)] 
    public interface ITest2 
    { 
     [OperationContract] 
     int add(int x, int y); 

    } 
    public class G : ITest2, ITest 
    { 
     public int add(int x, int y) 
     { 
      return x + y; 
     } 
     public int subtract(int x, int y) 
     { 
      return x + y; 
     } 
    } 
    public static void Test() 
    { 
     string baseAddress = "http://" + Environment.MachineName + ":8000/Service"; 
     ServiceHost host = new ServiceHost(typeof(G), new Uri(baseAddress)); 
     // host.AddServiceEndpoint(typeof(ITest), new BasicHttpBinding(), ""); 
     host.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true }); 
     host.Open(); 
     Console.WriteLine("Host opened"); 

     Console.Write("Press ENTER to close the host"); 
     Console.ReadLine(); 
     host.Close(); 
    } 
} 
+0

Cảm ơn bạn rất nhiều @carlosfigueira, Bạn đã cứu mạng tôi. !!! Cám ơn bạn một lần nữa. Vấn đề thực tế là tôi chỉ có một lớp cụ thể thực hiện cả hai giao diện. Nếu chúng ta chỉ định tên lớp được phân loại đầy đủ trong thẻ dịch vụ, tôi nhận được lỗi này "Một phần tử con có tên là 'dịch vụ' với cùng một khóa đã tồn tại ở cùng một phạm vi cấu hình." Những gì tôi đã làm, tôi đã tạo ra lớp học có nguồn gốc mới có tên là "G1" từ lớp thực hiện thực tế "G" và tôi tham khảo tên này trong tên dịch vụ, ok của nó bây giờ !!!! cảm ơn nhiều người! – amaz

1

Nếu bạn không cần giao diện ITest2 tiếp xúc như một dịch vụ, bạn chỉ cần loại bỏ các thuộc tính ServiceContract từ nó.

Nếu bạn cần ITest2 trong một dịch vụ khác nhau, bạn có thể sử dụng giao diện thừa kế để giải quyết vấn đề này:

interface ITest2 
{ 
    [OperationContract] 
    int Add(int x, int y); 
} 

[ServiceContract] 
interface ITest2Service : ITest2 { } 

Sử dụng ITest2 trong dịch vụ đầu tiên (mà cũng thực hiện ITest) và ITest2Service trong dịch vụ thứ hai.

+0

Tôi nghĩ OP muốn vạch trần một hợp đồng dịch vụ cho mỗi điểm cuối. hợp đồng của một lớp duy nhất. – abatishchev

+0

Nhưng ông nói rõ ràng: * Tôi chỉ muốn phơi bày ITest thông qua WCF * –

+0

@abatishchev: Tôi chỉ cần có cả ITest2 và ITest2 để được khám phá thông qua WCF. Nhưng các dịch vụ khác nhau của nó. thats lý do tại sao tôi đã đặt [ServiceContract] có – amaz

Các vấn đề liên quan