15

estoy consumiendo un WSDL predefinida con svcutil a la:.Net 4.5 Svcutil genera dos operaciones con el mismo nombre (Método y MethodAsync)

svcutil some_service.wsdl 

uno de los métodos generado tiene la siguiente firma:

[System.ServiceModel.OperationContractAttribute(Action="http://ws.example.org/SubmitData", ReplyAction="*")] 
SubmitDataResponse SubmitData(SubmitDataRequest request) 

Mientras scvutil de VS2010/.net35 genera sólo el arriba y VS no tiene ningún problema lanuching el servicio, el programa svcutil que forma parte de VS2012/.net45 también genera un método con la firma

[System.ServiceModel.OperationContractAttribute(Action="http://ws.example.org/SubmitData", ReplyAction="*")] 
Task<SubmitDataResponse> SubmitDataAsync(SubmitDataRequest request); 

Esto provoca una excepción en tiempo de ejecución:

System.InvalidOperationException: No se puede tener dos operaciones en el mismo contrato con el mismo nombre, métodos y SubmitDataAsync SubmitData en el tipo MyType violan esta regla. Puede cambiar el nombre de una de las operaciones cambiando el nombre del método o utilizando la propiedad Name de OperationContractAttribute.

Puedo solucionar esto eliminando los métodos adjuntos Async o simplemente usando svcutil desde VS2010. Pero me pregunto por qué svcutil genera una interfaz que causa una excepción de tiempo de ejecución (¿esto es un error?), Y si hay algo adicional que se supone que debo hacer para que funcione.

+1

Otra solución alternativa: utilice el indicador de línea de comandos '/ async-'. –

+0

¿Cuál es su marco de tiempo de ejecución? Tal vez es una limitación que no está presente en un marco posterior –

+0

@JamesManning El ensamblado apunta .Net 4.5 – vossad01

Respuesta

20

Parece que se modificó el comportamiento predeterminado. Si proporciona el parámetro /syncOnly, conserva el comportamiento anterior por mí.

/syncOnly       - Generate only synchronous method 
            signature. Default: generate synchronous 
            and task-based asynchronous method 
            signatures. 
+0

Gracias, @Jimmy, pero sé que el comportamiento ha cambiado (ver pregunta). También sé sobre el indicador '/ syncOnly' (ver mi comentario a la pregunta). Tengo curiosidad sobre por qué cambió el comportamiento. Lo mejor que tengo es que la nueva interfaz es deseable para los clientes aunque no es válida para los servidores. – vossad01

+1

Otra cosa que me desconcertó mientras buscaba una solución para esto fue que la información en la WWW indicaba que esto se debía a métodos sobrecargados y el problema se puede resolver dando a los métodos distintos nombres de OperationContract, pero claramente 'Método' y 'MethodAsync' no son métodos sobrecargados, por lo que de alguna manera, el código generado o VS lo interpreta para tener los mismos nombres de OperationContract. –

Cuestiones relacionadas