我正在尝试通过调用ChannelFactory.CreateChannel()
方法使用WCF访问旧的ASMX Web服务。
如果Web服务是由WCF创建的,那么一切都很简单。我可以实例化svcutil工具生成的代理客户端,或者手动调用ChannelFactory.CreateChannel()
方法。之后,我可以在两种情况下以相同的方式调用Web服务方法。
但是如果Web服务属于旧版ASMX,我仍然可以以任何方式实例化代理,但我无法调用相同的Web服务方法。
例如,假设这个基本的WCF Web服务接口:
[ServiceContract]
public interface IWebService
{
[OperationContract]
string HelloWorld();
}
使用svcutil
生成代理后,我可以通过以下两种方式之一调用HelloWorld()
:
WebServiceClient proxy = new ServiceReference.WebServiceClient();
textBox1.Text += proxy.HelloWorld();
或:
ChannelFactory<ServiceReference.IWebService2> cfactory =
new ChannelFactory<ServiceReference.IWebService>("BasicHttpBinding_IWebService");
ServiceReference.IWebService proxy = cfactory.CreateChannel();
((IClientChannel)proxy).Open();
textBox1.Text += proxy.HelloWorld();
现在假设这个ASMX Web服务:
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class WebService : System.Web.Services.WebService
{
public WebService() { }
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
}
使用HelloWorld()
工具生成的SoapClient
来调用svcutil
几乎与它是WCF网络服务一样:
WebServiceSoapClient proxy = new ServiceReference.WebServiceSoapClient();
textBox1.Text += proxy.HelloWorld();
但是如果您自己创建频道,则尝试致电HelloWorld()
,您将收到错误消息:
ChannelFactory<ServiceReference.WebServiceSoap> cfactory =
new ChannelFactory<ServiceReference.WebServiceSoap>("WebServiceSoap");
ServiceReference.WebServiceSoap proxy = cfactory.CreateChannel();
((IClientChannel)proxy).Open();
textBox1.Text += proxy.HelloWorld();
错误是“方法HelloWorld取0参数没有重载”。
这似乎是因为自动生成的接口HelloWorld
中的(ServiceReference.WebServiceSoap)
方法采用类型为ServiceReference.HelloWorldRequest
的参数。
所以最后,我只能通过查看svcutil
生成的代码并将我的实现改为此来使其工作:
ChannelFactory<ServiceReference.WebServiceSoap> cfactory =
new ChannelFactory<ServiceReference.WebServiceSoap>("WebServiceSoap");
ServiceReference.WebServiceSoap proxy = cfactory.CreateChannel();
((IClientChannel)proxy).Open();
ServiceReference.HelloWorldRequest inValue =
new WCFConsumeWebServices.ServiceReference.HelloWorldRequest();
inValue.Body = new WCFConsumeWebServices.ServiceReference.HelloWorldRequestBody();
ServiceReference.HelloWorldResponse retVal = proxy.HelloWorld(inValue);
textBox1.Text += retVal.Body.HelloWorldResult;
这是假设的吗?
对于一种类型的基本http Web服务,我们可以使用几乎相同的代码来调用方法,但对于另一种,我们需要查看生成的代理代码并根据您打开通道的方式实现不同的实现? / p>
答案 0 :(得分:1)
副手,我不知道为什么,但是WCF在与您的ASMX服务对话时似乎正在使用消息合同。你发布了整个服务吗?