我需要使用2个不同的SoapServices,但我一次只能访问1个,为什么?

本文关键字:一次 为什么 1个 访问 2个 SoapServices | 更新日期: 2023-09-27 18:07:07

我有一个学校的作业,我遇到了一个问题,我就是不明白是哪里出了问题。

在我的学校作业中,我们创建了一个与我的教师服务相同的服务。服务的目的是能够与我们连接到我们的服务的聊天客户端进行通信。

我遇到的问题是,当我得到能够在两个服务之间切换的任务时(这是类型servicename.ServiceSoapClient("ServiceSoap12"))。在我创建的服务中,我为我的教师服务添加了一个命名空间:[WebService(namespace = "http://dsweb.tmd.hv.se/users/wsi400/ChatService/")](这是稍后的目的,见下文)

我的服务的代码(应该是几乎相同的(相同的返回值和输入值))在这里:http://pastie.org/2461928

现在来谈谈真正的问题

当为一个服务创建客户端是小菜一碟时,试图在客户端中仅使用一个引用就能够在它们之间进行更改似乎是不可能的(但是其他人已经设法做到了,但是在检查代码等之后,我们不知道我的问题出在哪里)。正如我所说的,我已经在我的服务(我的asmx文件)中添加了本地引用,这是因为我显然需要从我的服务中指向我的教师服务的命名空间。

当连接到我的服务时,我使用以下代码:

   wsChatService.ServiceSoapClient wsService = new wsChatService.ServiceSoapClient("ServiceSoap12");

当添加我的服务时,它会在app.config中生成很多东西,我更改了一个值,以便能够切换到我的教师服务:

    <client>
        <endpoint address="http://dsweb.tmd.hv.se/users/wsi400/ChatService/Service.asmx" binding="basicHttpBinding"
            bindingConfiguration="ServiceSoap" contract="wsChatService.ServiceSoap"
            name="ServiceSoap" />
        <endpoint address="http://dsweb.tmd.hv.se/users/wsi400/ChatService/Service.asmx" binding="customBinding"
            bindingConfiguration="ServiceSoap12" contract="wsChatService.ServiceSoap"
            name="ServiceSoap12" />
    </client>

现在我试着用一个简单的按钮切换,测试函数在服务之间切换时总是有效的,但这取决于我选择使用什么服务作为程序集引用,这是我可以发布消息的服务。

这是客户端的代码:

    private void service1_Click(object sender, EventArgs e)
    {
        if (connNr == 2)
        {
            wsService = new wsChatService.ServiceSoapClient("ServiceSoap12", "http://localhost:63280/Service.asmx");
            connNr = 1;
            MessageBox.Show("Connection changed to: Markus 'nTesting connection: " + wsService.Test());
            textarray.Text = "";
            MessageBox.Show("Trying to send message: " + wsService.SendMessage("babbel", "Connecting..", "Connected?"));
        }
    }
    private void service2_Click(object sender, EventArgs e)
    {
        if (connNr == 1)
        {
            wsService = new wsChatService.ServiceSoapClient("ServiceSoap12", "http://dsweb.tmd.hv.se/users/wsi400/ChatService/Service.asmx");
            connNr = 2;
            MessageBox.Show("Connection changed to: http://dsweb.tmd.hv.se/users/wsi400/ChatService/Service.asmx 'nTesting connection: " + wsService.Test());
            textarray.Text = "";
            MessageBox.Show("Trying to send message: " + wsService.SendMessage("babbel", "Connecting..", "Connected?"));
        }
    }

我需要使用2个不同的SoapServices,但我一次只能访问1个,为什么?

我以前经常遇到这种情况这个问题通常是因为WSDL定义中使用的名称空间。例如,我的PHP SOAP服务在不同服务器上的。net客户端存在问题。

我使用了dev.myserver.co这样的命名空间。test.myserver.co.uk和srv1.myserver.co. Uk。分别在我的开发,测试和实时服务器。当我这样做的时候,我的。net客户端每次都必须重新构建,就像你遇到的问题一样。

我在我的每个web服务上将我的命名空间更改为虚构的命名空间(命名空间不必实际存在)xml.myserver.co.uk,然后您可以在c#客户端应用程序中重用生成的代理类。

问题是,如果你不控制WSDL的定义,那么你就不能轻易地改变它。

一种巧妙的方法是将WSDL定义保存在本地,进行更改并让客户端指向该定义。这样您就可以重用代理类,但是可以针对不同的服务器调用这些方法。