「Microsoft.Web.Services3.Addressing.Address」をシリアライズすることができません
-
20-09-2019 - |
質問
私はWSE3 / ASMX WebサービスのWCFラッパーWebサービスを記述しようとしています。 [醜い理由は、サードパーティのベンダーがSSLをサポートしていないということであり、それは、WS-Securityで作業するのBizTalk 2009 WCFアダプターのために必要なものです。だから、ベンダーが変化しない場合 - 私は地元のWCF Webサービスを呼び出す必要が...]
私は、組み込みのVS2008にWSE3プロキシ・ビルダーを取得するには、この記事を追っ: http://blogs.imeta.co.uk/ jyoung /アーカイブ/ 2008/8月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 {
...
私は何-SO-これまで「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」を取り除くのですか? エンドポイント・「のMicrosoft.Web.Services3.Addressing.Address」オブジェクトであるようです。私はWSE3を使用する場合は、コードを生成したので、それをシリアル化しようとします。
WCFを経由して、それを公開 -だから私は解決策が自由WSE3でさらに別のラッパーを書くことになると思います。 (私はWS3コードジェネレータを使用していますので)今、すべてがMicrosoft.Web.Services3.WebServicesClientProtocolから継承する - しかし、トリックは、ベンダーのWebサービスは、数多くの大規模かつ複雑なオブジェクトを持っていることです。私は実際に手動で再びそれらのすべてを構築する必要はありません。上記の例では、「ValuationService」は、オブジェクトのひとつです。
解決 2
さて、ここで問題となりました。私は少し曇りを取得し、4つのサービスと数十の方法、およびこれまでWCFからWSE3を使用する最初の時間を公開し、このアプリケーションの複雑さで失われました。
私が書いたラッパーはValuationService自体を返すようにしようとしていたので、エラーでした。それはダム間違いでした。 ValuationServiceは、問題を引き起こしていたアドレッシングクラスが含まれてMicrosoft.Web.WebServices3.WebServicesClientProtocolを実装しました。
ラッパーがクライアントとしてValuationServiceを使用して、唯一の評価(またはValuationResult)を返すようになっていました。 valuationResultはもちろんシリアライズすることができ、文字列、小数、ブール値、などからなるただのオブジェクト...です。
他のヒント
あなたは「事実の後に」直列化可能な何かをすることはできません。質問です:あなたがのために「アドレス」という何が必要ですか?
あなたはおそらく(私は疑いようそれがURLの場合)、あなたのWCFサービスへのクライアントから文字列としてアドレスを渡すことがしたいように、あなたのWCFラッパーを変更し、あなたの内側の「住所」のインスタンスを作成することができますWCFサービスクラス?