ServiceRoute + WebServiceHostFactory mata a geração de WSDL? Como criar serviço WCF sem extensão com? Wsdl

Estou tentando usar serviços WCF sem extensão / .svc-less. Alguém pode confirmar ou negar o problema que estou tendo?

Eu uso o roteamento no código e faço isso em Application_Start de global.asax.cs:

RouteTable.Routes.Add(new ServiceRoute("Data", new WebServiceHostFactory(), typeof(DataDips))); 

Eu testei no IIS 6 e IIS 7.5 e posso usar o serviço muito bem (ou seja, minha configuração de manipulador de mapeamento de curinga sem extensão é corretamente apontada no ASP.NET). No entanto, a geração de metadados é totalmente complicada. Eu posso acertar meu ponto de extremidade / mex com o Cliente de Teste do WCF (e presumo svcutil.exe) – mas a geração? Wsdl que você normalmente obtém com .svc é torrada. Eu não posso batê-lo com um navegador (obter 400 pedido ruim), eu não posso batê-lo com wsdl.exe, etc. A geração de metadados está configurada corretamente no web.config.

Isso é um problema, é claro, porque o serviço é exposto como basicHttpBinding, de modo que um cliente antigo do estilo ASMX possa acessá-lo. Mas, é claro, o cliente não pode gerar o proxy sem uma descrição do WSDL.

Se, em vez disso, eu usar o roteamento serviceActivation na configuração, em vez de registrar uma rota no código:

      

Então voila … funciona.

Mas então eu não tenho um URL sem extensão. Se eu alterar relativeAddress de Data.svc para Data, obtenho uma exceção de configuração, pois isso não é suportado pela configuração. (Deve usar uma extensão registrada no WCF).

Eu também tentei usar este código em conjunto com a configuração acima:

 RouteTable.Routes.MapPageRoute("","Data/{*data}","~/Data.svc/{*data}",false); 

Meu pensamento é que eu posso apenas apontar o URL sem extensão no URL .svc configurado. Isso não funciona – o /Data.svc continua a funcionar, mas / Data retorna um erro 404.

Eu encontrei uma solução alternativa se estivesse usando urlMappings em config como este, em conjunto com serviceActivation acima:

    

O problema com isso é duplo – 1. Parece confuso 2. No WSDL gerado, os pontos de extremidade da operação ainda se referem a Data.svc /, em vez de Data / – portanto, há dependência de Data.svc que realmente existe / responde.

Isso não é realmente o que eu quero, mesmo que meio que resolva o problema.

Existe uma maneira correta de obter urls de serviço WCF sem extensão para gerar o WSDL corretamente?

Uau, eu me sinto idiota?

Eu deveria estar hospedando meu serviço com ServiceHostFactory, NÃO WebServiceHostFactory.

Assim que eu mudei de volta para o código da configuração … e troquei para esta linha de código:

 RouteTable.Routes.Add(new ServiceRoute("Data", new ServiceHostFactory(), typeof(DataDips))); 

Eu estava no negócio com uma URL sem extensão servindo WSDL e páginas de ajuda.

É uma pena que eu tenha perdido tanto tempo nisso. Foi um acidente que eu estava usando WebServiceHostFactory, mas não há renúncia na página de fábrica no MSDN sobre a funcionalidade reduzida. (Eu diria que remover o WSDL faz sentido, mas remover as páginas da Ajuda não pode simplesmente fornecer um atributo na configuração para renomear a página ‘Ajuda’ se houver uma operação REST com esse nome … suspiro).

Há uma observação nos documentos WebServiceHost http://msdn.microsoft.com/en-us/library/system.servicemodel.web.webservicehost.aspx

Eu tenho o mesmo problema. Sua solução funciona no meu código. Acabei de mudar o Global.asax assim:

 <%@ Application Language="C#" %> <%@ Import Namespace="System.Web.Routing" %> <%@ Import Namespace="System.ServiceModel.Activation" %> <%@ Import Namespace="System.ServiceModel.Web " %>  

Para

 <%@ Application Language="C#" %> <%@ Import Namespace="System.Web.Routing" %> <%@ Import Namespace="System.ServiceModel.Activation" %> <%@ Import Namespace="System.ServiceModel.Web " %>