Como posso mudar dinamicamente endereços de serviços web em .NET sem uma recompilação?

StackOverflow https://stackoverflow.com/questions/125399

Pergunta

Eu tenho o código que faz referência a um serviço Web, e eu gostaria que o endereço do serviço web para ser dinâmico (lida, um arquivo de configuração de banco de dados, etc.) para que ele seja facilmente alterado. Um uso importante disto será para implantar em vários ambientes, onde nomes de computador e endereços IP são diferentes. A assinatura de serviço da web será o mesmo em todas as implementações, apenas localizado em outro lugar.

Talvez eu tenha sido apenas estragado pelo Visual Studio assistente "Adicionar referência Web." - Parece que este deve ser algo relativamente fácil, embora

Foi útil?

Solução

Quando você gera uma referência da web e clique sobre a referência da web no Solution Explorer. No painel de propriedades você deve ver algo como isto:

Propriedades de Referência da Web

A alteração do valor para dinâmico irá colocar uma entrada no seu app.

Aqui está a CodePlex artigo que tem mais informações.

Outras dicas

Se você está realmente configurar dinamicamente isso, você deve definir o campo .url de instância da classe proxy que você está chamando.

A definição do valor no arquivo .config a partir de dentro de seu programa:

  1. É uma bagunça;

  2. Pode não ser lido até o próximo arranque da aplicação.

Se é apenas algo que precisa ser feito uma vez por instalação, eu concordo com os outros cartazes e usar o arquivo .config e a configuração dinâmica.

Eu sei que isto é uma questão de idade, mas a nossa solução é muito mais simples do que o que eu vejo aqui. Vamos utilizá-lo para chamadas WCF com VS2010 e para cima. O url corda pode vir de configurações do aplicativo ou de outra fonte. No meu caso, é uma lista suspensa onde o usuário escolhe o servidor. Theservice foi configurado através do serviço de referência add VS.

private void CallTheService( string url )
{
   TheService.TheServiceClient client = new TheService.TheServiceClient();
   client.Endpoint.Address = new System.ServiceModel.EndpointAddress(url);
   var results = client.AMethodFromTheService();
}

Eu tenho lutado com este problema por alguns dias e, finalmente, a lâmpada clicado. A chave para ser capaz de mudar a URL de um webservice em tempo de execução está substituindo o construtor, o que fiz com uma declaração de classe parcial. A descrição acima, definindo o comportamento URL para Dinâmico também deve ser feito.

Isso basicamente cria um wrapper de serviço da web onde se tem ao serviço web de recarga em algum momento, via referência de serviço add, você não perder o seu trabalho. A ajuda da Microsoft para as classes parciais afirma especialmente que parte da razão para esta construção é criar wrappers de serviços web. http://msdn.microsoft.com/en- us / library / wa80x488 (v = vs.100) .aspx

// Web Service Wrapper to override constructor to use custom ConfigSection 
// app.config values for URL/User/Pass
namespace myprogram.webservice
{
    public partial class MyWebService
    {
        public MyWebService(string szURL)
        {
            this.Url = szURL;
            if ((this.IsLocalFileSystemWebService(this.Url) == true))
            {
                this.UseDefaultCredentials = true;
                this.useDefaultCredentialsSetExplicitly = false;
            }
            else
            {
                this.useDefaultCredentialsSetExplicitly = true;
            }
        }
    }
}

comportamento Alterar URL para " dinâmico ".

Enquanto o métodos de serviço web e subjacentes aulas expostas não mudam, é bastante trivial. Com o Visual Studio 2005 (e mais recente), adicionando uma referência da web cria um app.config (ou web.config, para web apps) seção que tem essa URL. Tudo que você tem a fazer é editar o arquivo app.config para refletir a URL desejada.

Em nosso projeto, nossa abordagem simples era apenas para ter as entradas app.config comentadas por tipo de ambiente (desenvolvimento, teste, produção). Então, nós apenas remover o comentário da entrada para o tipo de ambiente desejado. codificação não precisava de especial lá.

Apenas uma nota sobre estática diferença beetween e dinâmica.

  • estático : você deve definir a propriedade URL cada vez que você chamar o serviço web. Isto porque URL base se o serviço web é no construtor da classe proxy.
  • dinâmico : a chave de configuração especial será criado para você em sua web.config arquivo. Por padrão classe de proxy irá ler URL a partir desta chave.

Se você está buscando o URL a partir de um banco de dados que você pode atribuí-lo manualmente para o serviço web propriedade de classe de proxy URL. Isto deve ser feito antes de chamar o método web.

Se você gostaria de usar o arquivo de configuração, você pode definir o comportamento aulas URL proxy para dinâmico.

Definitivamente usando a propriedade URL é o caminho a percorrer. Se para defini-la no app.config, o banco de dados, ou uma terceira espécie localização da depende de suas necessidades de configuração. Às vezes você não deseja que o aplicativo para reiniciar quando você altera o local de serviço web. Você pode não ter um balanceador de carga escalar o back-end. Você pode ser hot-patching um erro de serviço web. Sua implementação pode ter problemas de configuração de segurança também. Quer se trate de nomes de usuário db produção e senhas ou até mesmo a informação ws segurança auth. A separação adequada de funções você pode obter em algumas configurações de configuração mais envolvidos.

Se você adicionar uma classe wrapper em torno das classes proxy gerado, você pode definir a propriedade Url de alguma forma unificada toda vez que você criar a classe wrapper para chamar um método web.

solition aberta explorador

clique direito no Comportamento webservice mudança URL para Dinâmico

clique no 'mostrar todos os arquivos' ícone na Solution Explorer

na edição de referência web o arquivo Reference.cs

mudança constructer

public Service1() {
        this.Url = "URL"; // etc. string  variable this.Url = ConfigClass.myURL
      }

Para mim uma referência a um WebService é um

serviço de referência

.

De qualquer forma, é muito fácil. Como alguém disse, você só tem que mudar a URL no arquivo web.config.

<system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="YourServiceSoap" />
      </basicHttpBinding>
    </bindings>
    <client>
        **** CHANGE THE LINE BELOW TO CHANGE THE URL **** 
        <endpoint address="http://10.10.10.100:8080/services/YourService.asmx"
          binding="basicHttpBinding" bindingConfiguration="YourServiceSoap"
          contract="YourServiceRef.YourServiceSoap" name="YourServiceSoap" />
    </client>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top