Domanda

Sto cercando di scrivere un servizio Web WCF wrapper per un servizio web WSE3 / ASMX. [Il brutto motivo è che un terzo fornitore di parti non sosterrà SSL e che è ciò che è necessario per BizTalk 2009 adattatore WCF per lavorare con WS-Security. Quindi, se il venditore non cambia - ho bisogno di chiamare un servizio WCF web locale ...]

Ho seguito questo articolo per ottenere il proxy-builder WSE3 built-in per VS2008: http://blogs.imeta.co.uk/ jyoung / archive / 2008/08/29 / 345.aspx Faccio un riferimento Web al servizio Web remoto .asmx del fornitore.

I creare e pubblicare il mio webservice a livello locale, e cercano solo di tirarlo su nel browser, e ottengo questo errore:

  

System.InvalidOperationException: An   È stata generata un'eccezione in una chiamata a un   WSDL estensione esportazione:   System.ServiceModel.Description.DataContractSerializerOperationBehavior   contrarre:    http://tempuri.org/:IValuationService   ----> System.Runtime.Serialization.InvalidDataContractException:   genere   'Microsoft.Web.Services3.Addressing.Address'   non può essere serializzato. Prendere in considerazione la marcatura   con la DataContractAttribute   attributo, e marcatura tutta la sua   membri desiderati serializzato con la   DataMemberAttribute attributo. Vedere   Microsoft .NET Framework   documentazione per altro sostenuto   tipi.

Come posso fare un oggetto che non ho scritto serializeable ( 'Microsoft.Web.Services3.Addressing.Address')? E 'possibile realizzare quello che sto cercando?

Grazie,

Neal Walters


Altre Informazioni - Lunedi Nov 16, 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 {
...

L'unico posto dove posso trovare alcun riferimento che-così-mai 'Microsoft.Web.Services3.Addressing.Address' è qui, sulla metadati quando faccio un "Vai a definizione" del 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;
    }
}

Quindi, in altre parole, come faccio a sbarazzarsi di 'Microsoft.Web.Services3.Addressing.Address'? Sembra che EndPointReference è in oggetto la 'Microsoft.Web.Services3.Addressing.Address'. Quindi, se uso il WSE3 codice generato, si tenta di serializzare esso.

Quindi penso che la soluzione sarà quella di scrivere ancora un altro involucro che è WSE3 gratuito - ed esporlo tramite WCF. Ma il trucco è che i servizi web vendor ha numerosi grandi e complessi oggetti - che ora tutti ereditano da Microsoft.Web.Services3.WebServicesClientProtocol (dal momento che sto utilizzando il generatore di codice WS3). Io davvero non voglio costruire manualmente tutti loro ancora una volta. Nell'esempio di cui sopra, "ValuationService" è solo uno di tali oggetti.

È stato utile?

Soluzione 2

D'accordo, qui era il problema. Ero un po 'nuvoloso e perso nella complessità di questa applicazione che espone 4 servizi e decine di metodi, e la prima volta di utilizzare sempre WSE3 da WCF.

L'errore è stato perché l'involucro che ho scritto stava cercando di restituire il ValuationService stesso. E 'stato un errore stupido. Il ValuationService ha attuato gli Microsoft.Web.WebServices3.WebServicesClientProtocol che includeva la classe di indirizzamento che è stata la causa del problema.

Il wrapper avrebbe dovuto utilizzare la ValuationService come client, e restituire solo la valutazione (o ValuationResult). La valuationResult è naturalmente solo un oggetto costituito da stringhe, decimali, booleani, ecc ... che può essere serializzato.

Altri suggerimenti

Non si può fare qualcosa serializzabile "dopo il fatto". La domanda è: che cosa avete bisogno che "Indirizzo" per?

si potrebbe forse cambiare il tuo involucro WCF in modo che si sarebbe passare un indirizzo (se questo è un URL, ho il sospetto) come una stringa dal client al servizio WCF, e quindi creare un'istanza di "Indirizzo" all'interno della vostra WCF classe di servizio?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top