C# WCF中的两个接口和一个具体类
请检查下面的示例C# WCF中的两个接口和一个具体类,c#,.net,wcf,known-types,C#,.net,Wcf,Known Types,请检查下面的示例 namespace GServices { [ServiceKnownType(typeof(SearchType))] [ServiceContract(SessionMode = SessionMode.Allowed)] public interface ITest { [OperationContract] int subtract(int x, int y); } [ServiceKno
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有subtract()方法,Itest2有add()方法
两者都由一个名为G的具体类实现
如果我只想通过WCF公开ITest,我有以下端点配置
<service name="GQS1" behaviorConfiguration="GQwcfBehaviour">
<endpoint address="DP2Svcs" binding="wsHttpContextBinding" bindingConfiguration="wsHttpEndpointBindingConfig" contract="GServices.itest">
<identity>
<dns value="localhost" />
</identity>
</endpoint>
</service>
当我运行此服务并检查wsdl时,我可以看到itest2中的方法也出现在wsdl中。在本例中,只应公开subtract()方法。但是add()方法也是公开的
我的要求是ITest接口中的方法只能公开。在本例中,我只想公开ITest中声明的subtract()方法。但它们的两个实现都只驻留在一个具体类“G”中。我错过了什么
编辑:我已给出我的Service.svc文件内容:
<%@ ServiceHost Language="C#" Debug="true" Service="GServices.G" %>
如果不需要将
ITest2
接口作为服务公开,只需从中删除ServiceContract
属性即可
如果您需要在不同的服务中使用ITest2
,可以使用接口继承来解决此问题:
interface ITest2
{
[OperationContract]
int Add(int x, int y);
}
[ServiceContract]
interface ITest2Service : ITest2 { }
在第一个服务(也实现了
ITest
)中使用ITest2
,在第二个服务中使用ITest2Service
。确保配置中
元素的name
属性的值是服务类的完全限定名。在您的配置中,端点协定名称由命名空间(gsservices.itest)限定,但服务不是(GQS1)。如果您没有针对特定服务的任何服务混淆,WCF将添加一个默认端点,该端点将暴露您的问题。例如,在下面的代码中,添加一个端点的行被注释掉,服务上的WSDL显示了这两个操作。但是,如果取消注释该行(这将使服务只有一个ITest类型的端点),则只会显示“subtract”操作
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();
}
}
你公开的方法的返回类型是什么?是
G
还是ITest
@abatishchev:好的,对不起,我从开发代码中复制并更改了名称。对你来说,拥有真实的名称不是更方便吗?只是想知道:)@abatishchev:我也这么做了。我已经给出了“contract=”GServices.itest“在端点配置中,绑定中的契约不应该是GServices.ITest
而不是GServices.ITest
?我想OP应该公开每个端点的服务契约。并通过单个类实现所有契约。听起来很合理,但他明确表示:我只是想通过WCF@abatishchev:我只需要通过WCF对ITest和ITest2进行爆炸。但是它的不同服务。这就是为什么我提出[服务合同]there@thya:所以service1/endpoint1公开interface1,service2/endpoint2公开interface2,对吗?虽然这可以解决您的问题,但我不确定此设置的值是多少。在第一次服务中,您将如何调用ITest2
?每次客户端创建会话并在会话结束时销毁时,它都会由WCF实例化。非常感谢@carlosfigueira,你救了我的命!!!再次感谢你。实际的问题是,我只有一个实现这两个接口的具体类。如果我们在服务标签中指定完全合格的类名,我会得到这个错误“一个名为'service'的子元素在相同的配置范围内已经存在”。我所做的是,我从实际的实现类“G”创建了一个名为“G1”的新派生类,我在服务名中引用了这个名称,现在可以了!!!!谢谢你,伙计!