문제

WSE3/ASMX 웹 서비스를위한 WCF 래퍼 웹 서비스를 작성하려고합니다. [추악한 이유는 제 3 자 공급 업체가 SSL을 지원하지 않기 때문에 Biztalk 2009 WCF 어댑터가 WS-Security와 협력하는 데 필요한 이유입니다. 따라서 공급 업체가 변경되지 않으면 로컬 WCF 웹 서비스를 호출해야합니다 ...

이 기사를 따라 WSE3 프록시 빌더를 VS2008로 내장했습니다.http://blogs.imeta.co.uk/jyoung/archive/2008/08/29/345.aspx공급 업체의 .AMSX 원격 웹 서비스에 대한 웹 참조를 만듭니다.

웹 서비스를 로컬로 빌드하고 게시하고 브라우저에 가져 오고이 오류를 얻으려고합니다.

System.InvalidOperationException : WSDL Export Export Exportsension에 대한 호출에서 예외가 발생했습니다. 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를 통해 노출시키는 것입니다. 그러나 Vendors Web Services에는 수많은 크고 복잡한 객체가 있다는 것입니다.이 객체는 이제 Microsoft.web.services3.webservicesclientProtocol (WS3 코드 생성기를 사용하기 때문에)에서 상속합니다. 나는 정말로 그들 모두를 수동으로 만들고 싶지 않습니다. 위의 예에서 "Valuationservice"는 그러한 객체 중 하나 일뿐입니다.

도움이 되었습니까?

해결책 2

좋아, 여기 문제가 있었다. 나는 4 개의 서비스와 수십 개의 방법을 노출시키는이 응용 프로그램의 복잡성에서 약간 흐려지고 WCF에서 WSE3를 처음 사용하는이 응용 프로그램의 복잡성을 잃어 버렸습니다.

오류는 내가 쓴 래퍼가 Valuationservice 자체를 반환하려고했기 때문입니다. 그것은 멍청한 실수였습니다. ValuationService는 문제를 일으키는 주소 지정 클래스를 포함하는 Microsoft.web.webservices3.webservicesclientProtocol을 구현했습니다.

래퍼는 valuationservice를 클라이언트로 사용하고 평가 (또는 ValuationResult) 만 반환해야했습니다. ValuationResult는 물론 현, 소수성, 부울 등으로 구성된 대상 일뿐입니다.

다른 팁

"사실 이후"직렬화 가능한 것을 만들 수 없습니다. 문제는 다음과 같습니다. "주소"를 위해 무엇이 필요합니까?

클라이언트에서 WCF 서비스로 문자열로 주소를 전달할 수 있도록 WCF 래퍼를 변경하고 WCF 서비스 클래스 내부에서 "주소"인스턴스를 만들 수 있습니다. ?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top