ama*_*maz 6 .net c# wcf known-types
请查看以下示例
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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
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>
Run Code Online (Sandbox Code Playgroud)
当我运行这个服务并检查wsdl时,我可以看到itest2中的方法也出现在wsdl中.在此示例中,应仅公开subtract()方法.但是add()方法也暴露了.
我的要求是只暴露ITest接口中的方法.在这种情况下,我想只公开在ITest中声明的subtract()方法.但它们的实现都只存在于一个具体的类"G"中.我在这里错过了什么?
编辑:我已经提供了Service.svc文件内容:
<%@ ServiceHost Language="C#" Debug="true" Service="GServices.G" %>
Run Code Online (Sandbox Code Playgroud)

确保配置中元素name中的属性值是服务类的完全限定名称。在您的配置中,您具有由命名空间 (GServices.itest) 限定的端点合约名称,但服务不是 (GQS1)。如果您没有针对特定服务的任何服务配置,WCF 将添加一个默认端点,这将暴露您遇到的问题。例如,在下面的代码中,添加一个端点的行被注释掉,服务上的 WSDL 显示这两项操作。但是,如果您取消注释该行(这将使服务只有一个 ITest 类型的端点),则只会显示“减去”操作。<service>
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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
939 次 |
| 最近记录: |