Pergunta

Eu quero começar a pasta de trabalho de um aplicativo WCF. Como posso conseguir?

Se eu tentar

HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath)

Eu recebo uma exceção de referência nula (o objeto Http.Current é nulo).


O que eu quis dizer com a pasta de trabalho foi a pasta onde o meu serviço WCF está em execução. Se eu set aspNetCompatibilityEnabled="true", eu recebo este erro:

O servidor não forneceu uma resposta significativa; isso pode ser causado por uma incompatibilidade do contrato, um desligamento sessão prematura ou um erro interno do servidor.

Foi útil?

Solução

Eu precisava da mesma informação para o meu IIS6 hospedado aplicativo WCF e eu achei que isso funcionou para mim:

string apPath = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

Como sempre, YMMV.

Outras dicas

Por favor, veja ongle resposta de abaixo. É muito melhor do que este.

Atualização depois de mais informações

A seguir trabalhou para mim. Eu testei-o com um novo serviço WCF I hospedado no IIS através de uma Service1.svc.

  1. Adicionar <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/> a configuração web. <system.serviceModel>..</ ..> já existia.
  2. Adicionar AspNetCompatibilityRequirementsAttribute ao serviço com o Modo permitidos.
  3. Use HttpContext.Current.Server.MapPath("."); para obter o diretório raiz.

Abaixo está o código completo para a classe de serviço. Eu não fez alterações na interface IService1.

[AspNetCompatibilityRequirements(RequirementsMode=AspNetCompatibilityRequirementsMode.Allowed)]
public class Service1 : IService1
{
    public void DoWork()
    {
        HttpContext.Current.Server.MapPath(".");
    }
}

E a seguir é um trecho do web.config.

<system.serviceModel>
    <!-- Added only the one line below -->
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>

    <!-- Everything else was left intact -->
    <behaviors>
        <!-- ... -->
    </behaviors>
    <services>
        <!-- ... -->
    </services>
</system.serviceModel>

resposta Old

O que você quer dizer com a pasta de trabalho? serviços WCF pode ser hospedado em diversas maneiras diferentes e com diferentes terminais de modo pasta de trabalho é um pouco ambígua.

Você pode recuperar o "pasta de trabalho" normal com uma chamada para Directory.GetCurrentDirectory () .

HttpContext é um objeto ASP.Net. Mesmo se WCF podem ser hospedados em IIS, ainda não é ASP.Net e por essa razão a maioria das técnicas ASP.Net não funcionam por padrão. OperationContext é equivalente a HttpContext do WCF. O OperationContext contém informações sobre a solicitação de entrada, resposta de saída entre outras coisas.

Embora a maneira mais fácil pode ser para executar o serviço em ASP .net modo de compatibilidade alternando-lo no web.config. Isso deve lhe dar acesso ao ASP.Net HttpContext. Ele vai limitá-lo ao * HttpBindings e IIS que hospeda embora. Para alternar o modo de compatibilidade, adicione o seguinte para o web.config.

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
</system.serviceModel>

Dependendo do que você quer. I geralmente querem resolver um url como "~ / pasta / arquivo". Isto é o que trabalhou.

System.Web.Hosting.HostingEnvironment.MapPath("~/folder/file");

Mais geral, estou usando este

AppDomain.CurrentDomain.BaseDirectory

O aspNetCompatibilityEnabled = "true" deveria ter resolvido o meu problema, mas eu tenho esse erro:

O servidor não forneceu uma resposta significativa; isso pode ser causado por uma incompatibilidade do contrato, um desligamento sessão prematura ou um erro interno do servidor.

Eu resolvi meu problema com a obtenção do caminho físico do meu serviço WCF em execução, obtendo-lo do meu domínio de aplicativo atual:

AppDomain.CurrentDomain.BaseDirectory

Para referência ASP.NET apresenta como o objeto HttpContext, você precisa executar seu aplicativo WCF no modo de compatibilidade ASP.NET. Este artigo explica como fazer isso.

Use HostingEnvironment.ApplicationPhysicalPath em WCF para encontrar o seu caminho físico do aplicativo. Use namespace usando System.Web.Hosting;

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top