una servicio referencia que pueden puede obtener metadatos los invocar habilitar error desconocido contienen componente wcf web-services rest contract operation-contract

servicio - En el modelo de programación web de WCF, ¿cómo se puede escribir un contrato de operación con una matriz de parámetros de cadena de consulta(es decir, con el mismo nombre)?



los metadatos contienen una referencia que no se puede resolver (3)

Para responder a tu comentario sobre mi otra respuesta:

Puede hacer un parámetro de comodín al final de la cadena de consulta como

[WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "SomeRequest?qs1={*qs1}")] XElement SomeRequest2(string qs1);

De esta forma, el parámetro de cadena qs1 será toda la cadena de consulta sin procesar después de qs1 =, luego podrá analizarla manualmente en su código.

QueryStringConverter se basa en el formato de la cadena de consulta, por lo que hacer algo exactamente como usted desea no es posible sin posiblemente reescribir QueryStringConverter en lugar de las pequeñas anulaciones que hicimos en la otra respuesta.

Desde MSDN:

Los segmentos de comodines deben seguir las siguientes reglas:

  • Puede haber como máximo un segmento de comodín con nombre para cada cadena de plantilla.
  • Un segmento comodín con nombre debe aparecer en el segmento de la derecha en la ruta.
  • Un segmento comodín con nombre no puede coexistir con un segmento comodín anónimo dentro de la misma cadena de plantilla.
  • El nombre de un segmento comodín con nombre debe ser único.
  • Los segmentos comodín con nombre no pueden tener valores predeterminados.
  • Los segmentos comodín con nombre no pueden terminar con "/".

Utilizando el modelo de programación web WCF, se puede especificar un contrato de operación de la siguiente manera:

[OperationContract] [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "SomeRequest?qs1={qs1}&qs2={qs2}")] XElement SomeRequest1(string qs1, string qs2);

Ahora si tuviéramos que hacer un contrato que aceptara una matriz de parámetros con el mismo nombre (en este caso qs1 ) contrato como tal ...

[OperationContract] [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "SomeRequest?qs1={qs1}&qs1={qs2}")] XElement SomeRequest2(string qs1, string qs2);

Recibimos el mensaje de error en tiempo de ejecución cuando hacemos la invocación al método:

la cadena de consulta debe tener pares ''nombre = valor'' con nombres únicos. Tenga en cuenta que los nombres no distinguen entre mayúsculas y minúsculas. Consulte la documentación de UriTemplate para obtener más detalles.

¿Cómo se define un servicio HTTP que expone un recurso con una matriz de parámetros sin recurrir a una interfaz flexible?


Implementé un QueryStringConverter personalizado simple para que pueda hacer que qs1 sea una cadena [] y que la variable de cadena de consulta esté delimitada por comas (por ejemplo, http: // servidor / servicio / SomeRequest? Qs1 = val1, val2, val3, val4 )

[OperationContract] [WebGet(ResponseFormat = WebMessageFormat.Xml, UriTemplate = "SomeRequest?qs1={qs1}")] XElement SomeRequest2(string[] qs1);

Primero necesita una clase que herede de WebHttpBehavior para que podamos inyectar nuestro QueryStringConverter personalizado:

public class CustomHttpBehavior : System.ServiceModel.Description.WebHttpBehavior { protected override System.ServiceModel.Dispatcher.QueryStringConverter GetQueryStringConverter(System.ServiceModel.Description.OperationDescription operationDescription) { return new CustomQueryStringConverter(); } }

Entonces nuestro CustomQueryStringConverter que maneja los parámetros de cadena []:

public class CustomQueryStringConverter : System.ServiceModel.Dispatcher.QueryStringConverter { public override bool CanConvert(Type type) { if (type == typeof(string[])) { return true; } return base.CanConvert(type); } public override object ConvertStringToValue(string parameter, Type parameterType) { if (parameterType == typeof(string[])) { string[] parms = parameter.Split('',''); return parms; } return base.ConvertStringToValue(parameter, parameterType); } public override string ConvertValueToString(object parameter, Type parameterType) { if (parameterType == typeof(string[])) { string valstring = string.Join(",", parameter as string[]); return valstring; } return base.ConvertValueToString(parameter, parameterType); } }

Lo último que debe hacer es crear una extensión de configuración de comportamiento para que el tiempo de ejecución pueda obtener una instancia de CustomWebHttpBehavior:

public class CustomHttpBehaviorExtensionElement : System.ServiceModel.Configuration.BehaviorExtensionElement { protected override object CreateBehavior() { return new CustomHttpBehavior(); } public override Type BehaviorType { get { return typeof(CustomHttpBehavior); } } }

Ahora agregamos el elemento a nuestras extensiones de configuración para que se use nuestro CustomWebHttpBehavior, usamos el nombre de esa extensión en lugar de <webHttp /> en nuestro comportamiento:

<system.serviceModel> <services> <service name="NameSpace.ServiceClass"> <endpoint address="" behaviorConfiguration="MyServiceBehavior" binding="webHttpBinding" contract="NameSpace.ServiceClass" /> </service> </services> <behaviors> <endpointBehaviors> <behavior name="MyServiceBehavior"> <customWebHttp/> </behavior> </endpointBehaviors> </behaviors> <extensions> <behaviorExtensions> <add name="customWebHttp" type="NameSpace.CustomHttpBehaviorExtensionElement, MyAssemblyName" /> </behaviorExtensions> </extensions> <serviceHostingEnvironment aspNetCompatibilityEnabled="true" /> </system.serviceModel>

Ahora también puede extender su CustomQueryStringConverter para manejar otros tipos que el predeterminado no tiene, como los tipos de valores que aceptan valores.

NOTA: Se ha registrado un error en microsoft connect que se relaciona directamente con este código. El código en realidad no funciona en casi todas las circunstancias donde intenta consultar diferentes tipos de conversión.

http://connect.microsoft.com/VisualStudio/feedback/details/616486/bug-with-getquerystringconverter-not-being-called-by-webservicehost#tabs

Por favor, asegúrese de leer esto cuidadosamente antes de perder horas de su tiempo creando convertidores de cadenas de consulta REST personalizados que posiblemente no funcionen. (Se aplica a Framework 4.0 y abajo).


Tenga en cuenta que en WCF 3.5 debe especificar el nombre completo del ensamblado calificado en:

<extensions> <behaviorExtensions> <add name="customWebHttp" type="NameSpace.CustomHttpBehaviorExtensionElement, MyAssemblyName, NOT SUFFICIENT HERE" /> </behaviorExtensions> </extensions>

Justo como esto: SampleService.CustomBehavior, SampleService, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = null

De lo contrario, obtendrás una excepción:

Error de configuración
Descripción: Se produjo un error durante el procesamiento de un archivo de configuración requerido para atender esta solicitud. Revise los detalles de error específicos a continuación y modifique su archivo de configuración de manera adecuada.

Mensaje de error del analizador: elemento no válido en la configuración. El nombre de la extensión ''CustomWebHttp'' no está registrado en la colección en system.serviceModel / extensions / behaviorExtensions.