Pregunta

Estoy intentando escribir un servicio web WCF envoltura para un servicio web WSE3 / ASMX. [La razón por qué feo es que un proveedor tercero partido no apoyará SSL y que es lo que se necesita para BizTalk 2009 adaptador de WCF para trabajar con WS-Security. Así que si el vendedor no cambia - Tengo que llamar a un servicio WCF web local ...]

He seguido este artículo para obtener el WSE3 proxy-constructor incorporada para VS2008: http://blogs.imeta.co.uk/ jyoung / archivo / 2008/08/29 / 345.aspx Hago una referencia Web al servicio Web remoto asmx del proveedor.

construyo y publico mi servicio web a nivel local, y sólo trato de sacar el tema en el navegador, y sale este error:

  

System.InvalidOperationException: Un   excepción fue arrojado en una llamada a una   WSDL extensión de exportación:   System.ServiceModel.Description.DataContractSerializerOperationBehavior   contrato:    http://tempuri.org/:IValuationService   ----> System.Runtime.Serialization.InvalidDataContractException:   Tipo   'Microsoft.Web.Services3.Addressing.Address'   no puede ser serializado. Considere marca   con el DataContractAttribute   atribuir, y marcado la totalidad de su   miembros que desea en serie con el   DataMemberAttribute atributo. Ver   Microsoft .NET Framework   documentación para otra apoyada   tipos.

¿Cómo puedo hacer que un objeto que no he escrito ( 'Microsoft.Web.Services3.Addressing.Address') serializeable? ¿Es posible lograr lo que estoy tratando?

Gracias,

Neal Walters


Información adicional - Lunes, 16 de Nov de 2009:


[ServiceContract]
public interface IValuationService
{
    [OperationContract]
    ExpressLync.ValuationServiceWse GetPropertyInfoSourceRecordPolicyNum(string PolicyNumber);
}
// end of interface 

// here is part of reference.cs...
public partial class ValuationServiceWse : Microsoft.Web.Services3.WebServicesClientProtocol {
...

El único lugar donde puedo encontrar ninguna referencia de lo que tan nunca a 'Microsoft.Web.Services3.Addressing.Address' es aquí, en los metadatos cuando hago un "Ir a definición" de la Microsoft.Web.Services3.WebServicesClientProtocol

using Microsoft.Web.Services3.Addressing;
using Microsoft.Web.Services3.Design;
using System;
using System.Net;
using System.Web.Services.Protocols;
using System.Xml;

namespace Microsoft.Web.Services3
{
    public class WebServicesClientProtocol : SoapHttpClientProtocol
    {
        public WebServicesClientProtocol();

        public EndpointReference Destination { get; set; }
        public Pipeline Pipeline { get; set; }
        public SoapContext RequestSoapContext { get; }
        public bool RequireMtom { get; set; }
        public SoapContext ResponseSoapContext { get; }
        public string Url { get; set; }
        public bool UseDefaultCredentials { get; set; }

        public TSecurityToken GetClientCredential<TSecurityToken>() where TSecurityToken : Microsoft.Web.Services3.Security.Tokens.SecurityToken;
        protected override XmlReader GetReaderForMessage(SoapClientMessage message, int bufferSize);
        public TSecurityToken GetServiceCredential<TSecurityToken>() where TSecurityToken : Microsoft.Web.Services3.Security.Tokens.SecurityToken;
        protected override WebRequest GetWebRequest(Uri uri);
        protected override WebResponse GetWebResponse(WebRequest request);
        protected override WebResponse GetWebResponse(WebRequest request, IAsyncResult result);
        protected override XmlWriter GetWriterForMessage(SoapClientMessage message, int bufferSize);
        public void SetClientCredential<TSecurityToken>(TSecurityToken clientToken) where TSecurityToken : Microsoft.Web.Services3.Security.Tokens.SecurityToken;
        public void SetPolicy(Policy policy);
        public void SetPolicy(string policyName);
        public void SetServiceCredential<TSecurityToken>(TSecurityToken serviceToken) where TSecurityToken : Microsoft.Web.Services3.Security.Tokens.SecurityToken;
    }
}

Así, en otras palabras, ¿cómo me deshago de 'Microsoft.Web.Services3.Addressing.Address'? Parece que EndpointReference está en el objeto 'Microsoft.Web.Services3.Addressing.Address'. Así que si uso el WSE3 código generado, se intenta serializar.

Así que creo que la solución será la de escribir un nuevo envoltorio que es WSE3 libre - y exponerla a través de WCF. Pero el truco es que los proveedores de servicios web tiene numerosos objetos grandes y complejos - que ahora todos heredar de Microsoft.Web.Services3.WebServicesClientProtocol (ya que estoy usando el generador de código WS3). Realmente no quiero construir manualmente todos ellos de nuevo. En el ejemplo anterior, "ValuationService" es sólo uno de tales objetos.

¿Fue útil?

Solución 2

Bueno, aquí era el problema. Yo estaba un poco nublado y perdido en la complejidad de esta aplicación que expone a 4 servicios y métodos de decenas, y la primera vez que ha usado WSE3 de WCF.

El error fue debido a que el envoltorio que escribí estaba tratando de devolver la misma ValuationService. Eso fue un error tonto. El ValuationService hizo poner en práctica el Microsoft.Web.WebServices3.WebServicesClientProtocol que incluía la clase de direccionamiento que estaba causando el problema.

La envoltura se supone que el uso del ValuationService como cliente, y devolver sólo el de Valoración (o ValuationResult). El valuationResult Por supuesto, es sólo un objeto que consiste en cadenas, decimales, booleanos, etc ... que se puede serializar.

Otros consejos

No se puede hacer algo serializable "después del hecho". La pregunta es: ¿qué necesita que "Dirección" para?

Sería posible que cambie su envoltorio WCF por lo que estarías pasando una dirección (si es una URL como sospecho) como una cadena de su cliente a su servicio WCF, y luego crea una instancia de "Dirección" dentro de su clase de servicio WCF?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top