Изменить URL-адрес веб-службы во время выполнения [дубликата]

1

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

Например:

Если пользователь находится в городе "A", приложение подключится к веб-службе: "192.168.1.1:8010", если он отправится в город "B", подключится к "192.168.1.1:8020", в город "С" будет "192.168.1.1:8030" и т.д.

IP-адрес всегда один и тот же, какие изменения - номер порта.

Простая вещь? Да, но я не могу найти способ заставить его работать во время работы!

Когда я изменяю параметр URL-адреса (myWS.Url) веб-службы ("URL-адрес Behaivor == Dynamic") во время выполнения, сервер возвращает только null, меняя параметр на исходное значение, связь восстанавливается.

То же самое, если изменение сделано до компиляции, компилируется в город "А", работает только в городе "А", компилируется в город "Б", работает только в городе "Б".

Приложение первоначально разработано для Windows CE 5.0 с использованием VS2008 и CF3.5, но даже в VS2013 с. NET Framework 4.0 и Windows Seven "проблема" все еще происходит.

Кто-нибудь испытал это?

По просьбе, вот небольшая часть моего кода:

WSR.WSR myWS = new WSR.WSR();

//WSR added as a Web Reference

if (City_A)
{
    myWS.Url = "http://192.168.1.1:8010/WSR.apw";
}
else
{
    myWS.Url = "http://192.168.1.1:8020/WSR.apw";
}

Решение, заданное в этом разделе (Что нужно изменить для изменения URL-адреса веб-службы в С#?), Не работает для меня, потому что, как я уже сказал, когда я изменил свойство "Поведение URL", точка входа не была создана в мой файл app.config.

Вот файл app.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <configSections>
        <sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
            <section name="TrocaWebService.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
        </sectionGroup>
    </configSections>
    <startup> 

    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/></startup>
    <system.serviceModel>
        <bindings />
        <client />
    </system.serviceModel>
    <userSettings>
        <TrocaWebService.Properties.Settings>
            <setting name="TrocaWebService_WSR_WSR" serializeAs="String">
                <value>http://192.168.1.1:8010/WSR.apw</value>
            </setting>
        </TrocaWebService.Properties.Settings>
    </userSettings>
</configuration>
Теги:
web-services
asmx

1 ответ

0

Я использую привязку WCF (Visual Studio → Добавить ссылку на службу), чтобы создать классы прокси против WSDL. Затем во время выполнения я создам ClientBase (у которого есть конечная точка (то есть url)), используя этот код:

public static class ServiceClientFactory
{
    public static HttpBindingBase BuildBinding(string endpointUrl)
    {
        if (endpointUrl.ToLower().StartsWith("https"))
        {
            var binding = new BasicHttpsBinding(BasicHttpsSecurityMode.Transport);
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
            binding.MaxReceivedMessageSize = int.MaxValue - 1;
            return binding;
        }

        else
        {
            var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportCredentialOnly);
            binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Ntlm;
            binding.MaxReceivedMessageSize = int.MaxValue - 1;
            return binding;
        }
    }

    public static TClient CreateClient<TClient, TChannel>(string endpoint, string username, string password)
        where TClient : ClientBase<TChannel>
        where TChannel : class
    {
        var client = (TClient)
            Activator.CreateInstance(
                typeof (TClient),
                BuildBinding(endpoint),
                new EndpointAddress(endpoint));

        if (null == client.ClientCredentials)
            throw new Exception(
                string.Format("Error initializing [{0}] client.  Client Credentials object was null",
                    typeof(TClient).Name));


       //This is for setting Basic Auth
       client.ClientCredentials.Windows.ClientCredential =
            new NetworkCredential(
                username,
                password);

        client.ClientCredentials.Windows.AllowedImpersonationLevel =
            TokenImpersonationLevel.Delegation;

       return client;
    }
}

}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню