2011-01-02 11 views
5

estoy usando SvcUtil.exe para generar el código de WCF, así:¿Cómo puedo establecer un espacio de nombres sin sobrescribir el nombre de configuración del servicio con SvcUtil.exe?

SvcUtil.exe http://www.MyServer.com:8080/MyService/mex /out:"C:\test.cs" /mc 

puedo conseguir que funcione, pero si fijo añadir un argumento /namespace (/namespace:*,MyNamespace), sobrescribe el valor de ConfigurationName la generada ServiceContractAttribute de la interfaz generada:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "3.0.0.0")] 
[System.ServiceModel.ServiceContractAttribute(ConfigurationName="MyNamespace.MyServiceName")] 
public interface MyServiceName 
{ ... } 

Si no me puse el espacio de nombres, el valor de ConfigurationName es "MyServiceName", lo cual es correcto ("MyNamespace.MyServiceName" es incorrecta y que no funciona). He intentado añadir un/ServiceName: MyService argumento, pero me dice que dice

Error: The /serviceName: option conflicts with other options. Review your use of the tool.

¿Cómo puedo especificar un espacio de nombres para mis clases generadas sin sobrescribir la ConfigurationName?

Respuesta

8

Estoy teniendo el mismo problema. Tengo una ServiceReference que tiene ConfigurationName = "MyWebService.MyWebServiceSoap" que se generó cuando se agregó a través de VisualStudio.NET 2010. Cuando uso svcutil para generar esa misma clase desde msbuild, svcutil quiere configurar el ConfigurationName igual al valor que configuro para el espacio de nombres Así que si establece el atributo/n de esta manera:

/n:*,MyApplication.MyWebService.MyWebServiceSoap 

recibo el espacio de nombres adecuado para mis clases generadas, pero el ConfigurationName también está listo para MyApplication.MyWebService.MyWebServiceSoap.

Esto parece indicar que VS.NET no usa svcutil, y hay posts que encontré que parecen indicar esto también.

Me gustaría tener una mejor respuesta, pero ya que estoy usando svcutil de MSBuild, mi solución era dejar que svcutil generar la clase con el ConfigurationName incorrectos y luego utilizar la tarea FileUpdate modificar ese nombre utilizando una expresión regular. Una vez más, está lejos de ser ideal, pero no puedo ver nada en la documentación de svcutil que te permita especificar ConfigurationName.

Además, vale la pena mencionar que la opción serviceName se usa para exportar metadatos del código compilado, no es válido para generar clases proxy del cliente, que es probablemente la razón por la que obtienes esa opción serviceName conflictos de error.

Ver: http://msdn.microsoft.com/en-us/library/aa347733.aspx

2
No

una respuesta directa a la pregunta, pero la razón por qué el cambio de espacio de nombres no está trabajando para usted es que, probablemente, se olvidó de actualizar la referencia del contrato de configuración para ese servicio.

En la aplicación de configuración/web, buscar la mirada

<client> 
    <endpoint .. contract="MyServiceName"> 
    </endpoint> 
</client> 

en el atributo contract. Cuando no especificaste el espacio de nombres en svcutil, generó MyServiceName, y en web.config hiciste referencia al nombre de tu servicio con solo el nombre de la interfaz. Ahora, su interfaz está dentro de un espacio de nombres, por lo que necesita para cambiar la configuración para que diga:

<client> 
    <endpoint .. contract="MyNamespace.MyServiceName"> 
    </endpoint> 
</client> 

En resumen, la propiedad ConfigurationName en el atributo tiene que coincidir con el nombre de espacio de nombres y clase en el atributo contract de su archivo config .Es una clave mediante la cual encuentra la configuración correspondiente.

Cuestiones relacionadas