我正在探索ChannelFactory
,在这样做的同时我做了以下事情:
名为“Common”的程序集中的服务合同:
namespace Common
{
using System.ServiceModel;
[ServiceContract(Name = "ITestService", Namespace = "http://test/")]
public interface ITestService
{
[OperationContract(Name = "SayHello")]
string SayHello(string request);
}
}
托管在名为“WcfServiceApp”的 Web 应用程序下的服务:
请注意,我创建了另一个服务接口(合同)来创建服务。但合约的名称和命名空间与“Common”程序集中定义的合约相同。
namespace WcfServiceApp
{
[ServiceContract(Name = "ITestService", Namespace = "http://test/")]
public interface ITestServiceWithDiffDotNetName
{
[OperationContract(Name = "SayHello")]
string SayHelloAgain(string name);
}
// This service implements new service contract.
public class TestService : ITestServiceWithDiffDotNetName
{
public string SayHelloAgain(string request)
{
return "hello " + request;
}
}
// This service implements common service contract
public class TestService2 : Common.ITestService
{
public string SayHello(string request)
{
return "hello " + request;
}
}
}
有两个“.svc”文件(TestService.svc 和 TestService2.svc),每个文件都用于上面创建的服务。Web.config
有以下内容:
<system.serviceModel>
<services>
<service name ="WcfServiceApp.TestService" >
<endpoint binding="basicHttpBinding" contract="WcfServiceApp.ITestServiceWithDiffDotNetName"></endpoint>
</service>
<service name ="WcfServiceApp.TestService2" >
<endpoint binding="basicHttpBinding" contract="Common.ITestService"></endpoint>
</service>
</services>
<serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
</system.serviceModel>
调用这两个服务的客户端:
请注意,客户端正在使用ChannelFactory
“Common”库中定义的服务合同。
ChannelFactory<ITestService> commonServiceChannel = new ChannelFactory<ITestService>(new BasicHttpBinding(), "http://localhost/WcfServiceApp/TestService.svc");
var proxy = commonServiceChannel.CreateChannel();
var response = proxy.SayHello("Mike"); // response = "Hello"
ChannelFactory<ITestService> commonServiceChannel2 = new ChannelFactory<ITestService>(new BasicHttpBinding(), "http://localhost/WcfServiceApp/TestService2.svc");
var proxy2 = commonServiceChannel2.CreateChannel();
var response2 = proxy2.SayHello("Mike"); // response2 = "Hello Mike"
问题:
我观察到第一个服务(使用一些不同的服务合同创建)接收null
参数,而在第二个服务(使用用于创建的服务合同创建)中收到的参数ChannelFactory
是预期的“Mike”。
在 Fiddler 中,我可以正确看到该请求参数。
为什么会这样?
如果所有 XML 名称和命名空间都相同(尽管 .NET 接口的名称不同),服务调用是否应该不会成功,因为底层 SOAP 消息会相同?
如果我的客户的应用程序想用 Java 创建服务并且我的应用程序应该调用它,我担心会发生什么?