Frage

Ich versuche, einen WCF -Wrapper -Webdienst für einen WSE3/ASMX -Webdienst zu schreiben. [Der hässliche Grund dafür ist, dass ein Anbieter von Drittanbietern SSL nicht unterstützt und das für BizTalk 2009 WCF-Adapter benötigt wird, um mit WS-Security zu arbeiten. Wenn sich der Anbieter also nicht ändert, muss ich einen lokalen WCF -Webdienst anrufen ...

Ich folgte diesem Artikel, um den WSE3-Proxy-Builder auf VS2008 integrieren zu lassen:http://blogs.imeta.co.uk/jyoung/archive/2008/08/29/345.aspxIch mache einen Web -Verweis auf den .asmx Remote -Webdienst des Anbieters.

Ich baue und veröffentliche meinen Webservice vor Ort und versuche einfach, ihn im Browser aufzurufen und diesen Fehler zu erhalten:

System.invalidoperationException: Eine Ausnahme wurde in einen Aufruf an eine WSDL -Exportverlängerung geworfen: System.servicemodel http://tempuri.org/:ivaluationService----> System.Runtime.Serialization.invalidDatacontractException: Typ 'microsoft.web.Services3.Addressing.address' kann nicht serialisiert werden. Erwägen Sie, es mit dem DataContractAttribute -Attribut zu markieren und alle seine Mitglieder zu markieren, die Sie mit dem DataMemberAttribute -Attribut serialisieren möchten. Weitere unterstützte Typen finden Sie in der Microsoft .NET Framework -Dokumentation.

Wie kann ich ein Objekt erstellen, das ich nicht geschrieben habe ('microsoft.Web.Services3.Addressing.address') serialisierbar? Ist es möglich, das zu erreichen, was ich versuche?

Vielen Dank,

Neal Walters


Zusätzliche Informationen - Montag, 16. November 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 {
...

Der einzige Ort, an dem ich eine Referenz finden kann, was auch immer auf 'microsoft.Web.Services3.Addressing.address' ist, ist hier auf der Metadaten, wenn ich "zur Definition" des Microsoft.Web.Services3.webservicesclientProtocols mache

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;
    }
}

Mit anderen Worten, wie werde ich 'microsoft.Web.Services3.Addressing.address' loswerden? Es scheint, dass EndpoinTreference im Objekt 'microsoft.web.Services3.Addring.address' liegt. Wenn ich also den Code mit WSE3 generiert habe, versucht er, ihn zu serialisieren.

Ich denke, die Lösung wird darin bestehen, einen weiteren Wrapper zu schreiben, der WSE3 kostenlos ist - und sie über WCF freizulegen. Der Trick ist jedoch, dass die Web Services der Anbieter zahlreiche große und komplexe Objekte haben - die jetzt alle von microsoft.web.services3.webservicesClientProtocol erben (da ich den WS3 -Codegenerator verwende). Ich möchte sie wirklich nicht wieder manuell wieder bauen. Im obigen Beispiel ist "Bewertungsservice" nur eines dieser Objekte.

War es hilfreich?

Lösung 2

Okay, hier war das Problem. Ich wurde in der Komplexität dieser Anwendung, die 4 Dienste und Dutzende von Methoden enthüllt, ein wenig bewölkt und verlor, und das erste Mal, dass er WSE3 von WCF verwendet hat.

Der Fehler war, dass der von mir geschriebene Wrapper versuchte, den Bewertungsservice selbst zurückzugeben. Das war ein dummer Fehler. Der Bewertungsservice implementiert den Microsoft.Web.Webservices3.WebservicesClientProtocol, der die Adressierungsklasse enthielt, die das Problem verursachte.

Die Wrapper sollte den Bewertungsservice als Kunde verwenden und nur die Bewertung (oder vationalResult) zurückgeben. Das Ventrusionsult ist natürlich nur ein Objekt, das aus Saiten, Dezimalstellen, Booleschen usw. besteht, die serialisiert werden können.

Andere Tipps

Sie können nichts serialisierbares "nach der Tatsache" machen. Die Frage ist: Wofür brauchen Sie diese "Adresse"?

Könnten Sie möglicherweise Ihren WCF -Wrapper so ändern, dass Sie eine Adresse (wenn dies eine URL ist, wie ich vermute) als Zeichenfolge von Ihrem Kunden an Ihren WCF -Dienst ?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top