我知道我可以通过使用visual studio添加web引用来指向一些SOAP Web服务。
但我需要从代码中完成。
如何在代码中手动创建Web引用对象并从该对象访问所有方法? 基本上我想避免生成代理类。
答案 0 :(得分:1)
如果您可以获得服务合同(接口)的副本(svcUtil可以帮助解决此问题),那么您可以将其包含在项目中并使用ChannelFactory类动态创建通道以供客户端进行通信与服务。
我倾向于将它全部封装在SAL(服务应用层)中,以便根据需要重新使用。
这是一个简单的(并且绝不完整!)示例,演示了如何连接到一个虚构的时间服务并在不使用VS生成的代理的情况下调用GetTime()操作:
public class TimeSAL : IDisposable
{
private ChannelFactory<ITimeService> timeServiceProxyFactory;
private ITimeService timeServiceProxy;
private ITimeService TimeService
{
get
{
//create channel factory if not there
if (timeServiceProxyFactory == null)
timeServiceProxyFactory = new ChannelFactory<ITimeService>(new BasicHttpBinding(), new EndpointAddress("http://url_to_my_timeservice_endpoint")); //
if (timeServiceProxy == null)
timeServiceProxy = amlProxyFactory.CreateChannel();
return timeServiceProxy;
}
}
public string GetTime()
{
return TimeService.GetTime();
}
public void Dispose()
{
//dispose of ChannelFactory and proxy.
//ensure you check for comm faults to abort before closing
}
}
现在我可以根据需要在我的代码中使用此SAL:
....
using(TimeSAL timeSAL = new TimeSAL())
{
myBusinessObject.CurrentTime = timeSAL.GetTime();
}
....
如果您无法获得服务合同的副本,那么冗长的方式是手工制作肥皂请求。 Fiddler或soapUI可以帮助解决消息的样子。
希望其中一些有用。