Como obter o caminho de trabalho de um aplicativo WCF?
-
16-09-2019 - |
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.
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.
- Adicionar
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
a configuração web.<system.serviceModel>..</ ..>
já existia. - Adicionar
AspNetCompatibilityRequirementsAttribute
ao serviço com o Modo permitidos. - 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;