Мне нужно использовать 2 разных SoapServices, но я могу получить доступ только к 1 одновременно, почему? - PullRequest
4 голосов
/ 01 сентября 2011

У меня есть школьное задание, и я столкнулся с проблемой, которую просто не могу понять, в чем дело.

В моем школьном задании мы создали Службу, идентичную моей службе учителей.Смысл службы состоял в том, чтобы иметь возможность общаться с нашими клиентами чата, которые мы подключили к нашему сервису.

Проблема, с которой я столкнулся, заключается в том, что когда я получил задачу, чтобы иметь возможность переключаться между двумя службами (чтотип 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 голосов
/ 01 сентября 2011

Я постоянно сталкивался с этим Эта проблема обычно возникает из-за пространства имен, используемого в определении WSDL. например, у меня были проблемы с клиентами .NET моих служб PHP SOAP на разных серверах.

Я использовал пространства имен, такие как dev.myserver.co.uk, test.myserver.co.uk и srv1.myserver.co.uk соответственно на моих серверах разработки, тестирования и работы. Когда я делал это, мои клиенты .Net приходилось перестраивать каждый раз, как и проблему, с которой вы столкнулись.

Я изменил свое пространство имен на вымышленное (пространства имен на самом деле не должны существовать) xml.myserver.co.uk на каждом из моих веб-сервисов, а затем вы можете повторно использовать созданные прокси-классы в своих клиентских приложениях на C # .

Проблема в том, что если вы не управляете определением WSDL, вы не сможете его легко изменить.

Один хакерский способ - сохранить определение WSDL локально, внести изменения и попросить клиента указать на это. Таким образом, вы можете повторно использовать прокси-класс, но вызывать методы для разных серверов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...