Question

Je suis en train d'écrire un service Web wrapper WCF pour un service Web WSE3 / ASMX. [La raison laide pourquoi est-ce qu'un fournisseur 3ème partie ne soutiendra pas SSL et qui est ce qui est nécessaire pour adapter WCF BizTalk 2009 pour travailler avec WS-Security. Donc, si le vendeur ne change pas - je dois appeler un service Web WCF local ...]

J'ai suivi cet article pour obtenir le proxy constructeur WSE3 intégré pour VS2008: http://blogs.imeta.co.uk/ jyoung / archive / 2008/08/29 / 345.aspx Je fais une référence Web pour .asmx service Web distant du fournisseur.

Je construis et publier mon webservice localement, et juste essayer de le mettre dans le navigateur, et obtenir cette erreur:

  

System.InvalidOperationException: An   exception a été levée dans un appel à une   extension export WSDL:   System.ServiceModel.Description.DataContractSerializerOperationBehavior   Contrat:    http://tempuri.org/:IValuationService   ----> System.Runtime.Serialization.InvalidDataContractException:   Type   'Microsoft.Web.Services3.Addressing.Address'   ne peut pas être sérialisé. Pensez à marquer   avec le DataContractAttribute   attribuer, et le marquage de tout son   les membres que vous voulez sérialisé la   DataMemberAttribute attribut. Voir   Microsoft .NET Framework   documentation pour d'autres pris en charge   types.

Comment puis-je faire un objet que je n'ai pas écrit ( « Microsoft.Web.Services3.Addressing.Address ») serializeable? Est-il possible d'accomplir ce que je suis en train?

Merci,

Neal Walters


Informations complémentaires - lundi 16 novembre 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 {
...

Le seul endroit où je peux trouver aucune référence ce que-si-jamais « Microsoft.Web.Services3.Addressing.Address » est ici, sur les métadonnées quand je fais un « aller à la définition » du 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;
    }
}

En d'autres termes, comment puis-je me débarrasser de « Microsoft.Web.Services3.Addressing.Address »? Il semble que EndpointReference est dans l'objet 'Microsoft.Web.Services3.Addressing.Address de. Donc, si j'utilise le code généré WSE3, il essaie de sérialiser.

Je pense donc que la solution sera d'écrire un autre emballage qui est WSE3 libre - et l'exposer via WCF. Mais l'affaire est que les fournisseurs de services Web a de nombreux objets volumineux et complexes - qui maintenant tous Hériter de Microsoft.Web.Services3.WebServicesClientProtocol (depuis que je suis en utilisant le générateur de code WS3). Je ne veux pas créer manuellement tous à nouveau. Dans l'exemple ci-dessus, « ValuationService » est juste un de ces objets.

Était-ce utile?

La solution 2

D'accord, ici était le problème. Je devenais un peu nuageux et perdu dans la complexité de cette application qui expose 4 services et des dizaines de méthodes, et la première fois d'utiliser jamais WSE3 de WCF.

L'erreur est parce que l'emballage je l'ai écrit a essayé de retourner le ValuationService lui-même. Ce fut une erreur stupide. Le ValuationService a mis en oeuvre la Microsoft.Web.WebServices3.WebServicesClientProtocol qui comprenait la classe d'adressage qui était à l'origine du problème.

L'enveloppe était censé utiliser le ValuationService en tant que client, et retourner uniquement l'évaluation (ou ValuationResult). Le valuationResult est bien sûr tout un objet constitué de chaînes, décimales, booléens, etc ... qui peut être sérialisé.

Autres conseils

Vous ne pouvez pas faire quelque chose sérialisable « après le fait ». La question est: qu'est-ce que vous avez besoin que « Adresse » pour?

Pourriez-vous éventuellement changer votre emballage WCF de sorte que vous seriez passer une adresse (si c'est une URL comme je le soupçonne) en tant que chaîne de votre client à votre service WCF, puis créez une instance de « Adresse » à l'intérieur de votre classe de service WCF?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top