Problema
Al tratar de importar un servicio WCF en MSE construido a partir de Web Service Software Factory (WSSF), se me presento el siguiente error:
An application error occurred in Catalog Service Operation [GetIdFromName]. Error Detail [Exception Information Type[MseDataException] Source[Microsoft.ManagedSolutions.Mse.Catalog.Data] Message[Procedure or function ‘GetIDFromName’ expects parameter ‘@EntityName’, which was not supplied.] StackTrace[ at Microsoft.ManagedSolutions.Mse.Catalog.Data.Entity.GetIdFromName(String entityName, EntityClass entityClass, SqlTransaction transaction, SqlConnection connection) at Microsoft.ManagedSolutions.Mse.Catalog.Module.Business.EntityManager.GetIdFromName(String entityName, EntityClass entityClass, SqlTransaction transaction, SqlConnection connection)]Exception Information Type[SqlException] Source[.Net SqlClient Data Provider] Message[Procedure or function ‘GetIDFromName’ expects parameter ‘@EntityName’, which was not supplied.] StackTrace[ at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection) at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj) at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString) at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async) at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) at System.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(DbAsyncResult result, String methodName, Boolean sendToPipe) at System.Data.SqlClient.SqlCommand.ExecuteNonQuery() at Microsoft.ManagedSolutions.Mse.Catalog.Data.Entity.GetIdFromName(String entityName, EntityClass entityClass, SqlTransaction transaction, SqlConnection connection)]]
Causa
Al parecer el problema es causado por la forma como es serializado el WSDL del servicio. Construyendo el servicio con WSSF, inicialmente se definió el modelo con la siguiente serialización:
Al nivel del modelo del service Contract
Serializer Type = DataContractSerializer
Y a nivel de las operaciones:
Is Wrapped = True
Solución
Cambiar la forma como se serializa el servicio y no permitir que las operaciones sean “envueltas” (wrapped) con un elemento raíz., es decir,
Al nivel del modelo del service Contract
Serializer Type = XmlSerializer
Y a nivel de las operaciones:
Is Wrapped = False
La siguientes son las diferencias del WSDL generado, con una serialización tipo XmlSerializer vs DataContractSerializer.
Y sabor !!! Podemos importar el servicio en MSE.