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

时间:2011-08-31 20:53:33

标签: c# asp.net soap

我有一份学校作业,我遇到了一个我无法理解错误的问题。

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

我遇到的问题是我的任务是能够在两个服务之间切换(类型为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?"));
        }
    }

1 个答案:

答案 0 :(得分:0)

我曾经一直遇到这种情况 此问题通常是因为WSDL定义中使用的命名空间。例如,我曾经在不同的服务器上遇到PHP SOAP服务的.NET客户端问题。

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

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

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

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