如何手动创建Web引用

时间:2014-05-15 07:50:09

标签: c# visual-studio-2010 soap soap-client

我知道我可以通过使用visual studio添加web引用来指向一些SOAP Web服务。

但我需要从代码中完成。

如何在代码中手动创建Web引用对象并从该对象访问所有方法? 基本上我想避免生成代理类。

1 个答案:

答案 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可以帮助解决消息的样子。

希望其中一些有用。