2012-03-15 11 views
6

Tuvimos un pequeño incidente hoy que me hizo pensar. Tenemos un proyecto con una configuración de transformación web.config bastante estándar para nuestras diversas configuraciones. Hay una sección que controla el acceso a nuestros servicios de DAO que se parece a esto:Error en la transformación de web.config cuando no existe ningún valor para una transformación

<endpoint address="http://myserver/myservice1.svc/basicHttp" 
binding="basicHttpBinding" contract="MyAssembly.IItem" name="DataAccessEndPoint" 
kind="" endpointConfiguration="" /> 
<endpoint address="http://myserver/myservice2.svc/basicHttp" 
binding="basicHttpBinding" contract="MyAssembly.IItem2" name="LoggingEndPoint" 
kind="" endpointConfiguration="" /> 

Y una transformación de la siguiente manera:

<endpoint address="http://mytestserver/myservice1.svc" name="DaoEndPoint" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> 
<endpoint address="http://mytestserver/myservice2.svc" name="LoggingEndPoint" xdt:Transform="SetAttributes" xdt:Locator="Match(name)" /> 

Esperamos que pueda ha detectado el error aquí - el nombre de la DaoEndPoint no coincide. Desafortunadamente, el desarrollador que lo creó no lo hizo, y también se realizó una depuración local contra los servicios en vivo, lo que provocó que la implementación de la prueba, yup, apuntara a en vivo. Afortunadamente lo recogimos bastante rápido, ¡pero estoy seguro de que puedes ver el potencial de dolor extremo aquí!

Me puse a pensar en tu intento al crear archivos de transformación y me parece que si pones una transformación que intentas transformar algo. Por lo tanto, sería bueno si la transformación (y, por lo tanto, la implementación) fallara si hubiera una transformación DaoEndPoint pero no coincida con el elemento DaoEndPoint en el archivo .config principal.

Así que estoy como un lienzo para las opiniones de las personas, ¿esto sería útil? ¿Es simple? ¿Me estoy perdiendo el punto?

Además, ¿hay algo por ahí que hace esto? Me complace investigar y desarrollar una solución, pero estaría más feliz si alguien hubiera hecho el trabajo por mí;)

+0

No se sabe nada que cause una excepción, aunque podría ser útil. Puede intentar simplemente dejar el valor en blanco en el web.config principal y, si no se transforma, rápidamente obtendrá un error en la aplicación. No es tan útil, pero previene el acceso PROD involuntario. – dbugger

+0

El problema con esto es que no puede depurar localmente sin agregar un valor, lo que nos lleva de vuelta al problema original cuando el desarrollador se olvida de quitar ese valor de nuevo ... –

Respuesta

1

Vea la gran respuesta de Sayed Ibrahim Hashimi al this question, que implica la creación de una clase personalizada que hereda de Microsoft.Web.Publishing.Tasks.Transform. Puede usar la misma técnica pero heredar de la clase Locator y luego lanzar una excepción cuando no puede hacer coincidir un nodo de destino.

De hecho, yo mismo lo probé y pude tener la excepción lanzada durante la publicación. Sin embargo, mi clase de localizador personalizado (MyMatch) no hizo nada más que lanzar la excepción. Puede ser un poco de trabajo sobrescribir los métodos para imitar la clase Match (de la que no se puede heredar) y luego determinar el lugar apropiado para realizar una verificación final en caso de que no coincida.

De todos modos, definitivamente creo que sería útil al menos tener una opción que podría establecer dónde la publicación fallaría o le daría una advertencia cuando su transformación no surtiera efecto.

+0

Brill, este es el tipo de Lo que estaba buscando, voy a tratar de obtener algo organizado y publicado en github en las próximas semanas. (¡Disculpas por la respuesta tardía por cierto, en vacaciones sin internet!) –

Cuestiones relacionadas