'Microsoft.Web.Services3.Addressing.Address'无法序列化

Asked
Viewd1183

2

我正在尝试为WSE3 / ASMX Web服务编写WCF包装器Web服务。 [丑陋的原因是,第三方供应商不支持SSL,这就是BizTalk 2009 WCF适配器与WS-Security一起使用所需要的。因此,如果供应商没有改变-我需要调用本地WCF Web服务...]

我关注了这篇文章,以获取VS2008内置的WSE3代理生成器: http://blogs.imeta.co.uk/ jyoung / archive / 2008/08/29 / 345.aspx 我对供应商的.asmx远程Web服务进行了Web参考。

我在本地构建和发布我的Web服务,只是尝试在浏览器中启动它,并得到此错误:

System.InvalidOperationException:一个 呼叫时引发异常 WSDL导出扩展: System.ServiceModel.Description.DataContractSerializerOperationBehavior 合同: http://tempuri.org/:IValuationService ----> System.Runtime.Serialization.InvalidDataContractException: 类型 'Microsoft.Web.Services3.Addressing.Address' 无法序列化。考虑标记 它与DataContractAttribute 属性,并标记所有 您要序列化的成员 DataMemberAttribute属性。看到 Microsoft .NET Framework 其他支持的文档 类型。

如何使我未编写的对象('Microsoft.Web.Services3.Addressing.Address')可序列化?是否有可能完成我正在尝试的工作?

谢谢

尼尔·沃尔特斯


附加信息-2009年11月16日,星期一:
 [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 {
...
 

唯一可以找到对'Microsoft.Web.Services3.Addressing.Address'的引用的地方 在此处,当我对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;
    }
}
 

因此,换句话说,如何摆脱“ Microsoft.Web.Services3.Addressing.Address”? 似乎EndpointReference在'Microsoft.Web.Services3.Addressing.Address'对象中。因此,如果我使用WSE3生成的代码,它将尝试对其进行序列化。

因此,我认为解决方案将是编写又一个WSE3免费的包装器,并通过WCF公开它。但是诀窍在于,供应商的Web服务具有许多大型复杂对象-现在它们都继承自Microsoft.Web.Services3.WebServicesClientProtocol(因为我正在使用WS3代码生成器)。我真的不想再次手动构建它们。在上面的示例中,“ ValuationService”只是此类对象之一。

2 个答案

1

好的,这就是问题所在。我对这个应用程序的复杂性感到有些困惑和困惑,该应用程序公开了4种服务和数十种方法,这是第一次使用WCF中的WSE3。

错误是因为我编写的包装程序试图返回ValuationService本身。那是一个愚蠢的错误。ValuationService确实实现了Microsoft.Web.WebServices3.WebServicesClientProtocol,其中包括导致问题的Addressing类。

包装程序应该使用ValuationService作为客户端,并且仅返回Valuation(或ValuationResult)。当然,valuationResult只是一个由字符串,小数,布尔值等组成的对象,可以序列化。

1

您不能“在事后”使可序列化的东西。问题是:您需要该“地址”做什么?

您是否可以更改WCF包装程序,以便将一个地址(如果我怀疑是URL)作为字符串从客户端传递到WCF服务,然后在您的内部创建“ Address”的实例WCF服务等级?

  • 已解决-请在下面查看我的答案。

    NealWaltersNovember 16, 2009 15:44
  • 如何摆脱“ Microsoft.Web.Services3.Addressing.Address”?它似乎是“自我插入。我没有要特别列出的内容。

    NealWaltersNovember 16, 2009 14:29