2008-12-01 3 views
1

이전에는 가져온 WSDL 웹 참조를 사용하는 C# 프로젝트에서 사용자 지정 SOAP 헤더를 만들어야했습니다. 나는 그것을 할 수있는 방법을 찾았지만 나는 결코 그것에 만족하지 못했고 더 좋은 방법이 있는지 궁금해했습니다.C#에서 SOAP 헤더를 사용자 지정하는 더 좋은 방법이 있습니까?

[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://model.test.net")] 
[System.Xml.Serialization.XmlRootAttribute("securitytoken", Namespace = "http://model.test.net", IsNullable = false)] 
public class SpecialHeader : SoapHeader 
{ 
    [System.Xml.Serialization.XmlTextAttribute()] 
    public string aheadervalue; 
} 

내가 다음 WSDL에서 생성 된 코드를 수정하고 새로운 헤더의 인스턴스에 referen에게 가전을 추가했고, 각하기 전에 다음과 같은 : 내가 한 일은의 SOAPHeader에서 파생되는 헤더를 생성했다 나는 사용자 정의 헤더를 포함하고 싶었다 해당 웹 전화 :

"인스턴스 이름이"사용자 정의 헤더의 예 변수 이름이 생성 된 클래스에
[System.Web.Services.Protocols.SoapHeaderAttribute("instancename", Direction=System.Web.Services.Protocols.SoapHeaderDirection.InOut)] 

.

WSDL의 모든 변경 사항이 클래스를 재생성하기 때문에 다시 완료해야한다는 점을 제외하고는 정상적으로 작동합니다. 다른 언어에서는 생성 된 코드 외부에 헤더를 추가 할 수 있으므로 C#에서 수행되는 방법이 누락되었습니다. 이 작업을 수행하는 더 좋은 방법이 있습니까?

답변

0

할 일이 있습니다. 꼭 필요한 것은 아니며 아주 단순한 웹 서비스에서는 노력할 가치가 없을 수도 있지만 적어도 코드를 다시 생성 할 때 속성을 다시 추가하지 않아도됩니다.

발전기는 부분 클래스를 생성하기 때문에, 당신은 할 수 있습니다

  1. 다른 "부분"부분 (즉, 사용과 웹 서비스 클래스 (SoapHttpClientProtocol에서 파생 된 하나) 확장 프로젝트에 파일을 추가 생성 된 클래스와 동일한 네임 스페이스 및 이름을 "partial"로 표시).

  2. 생성 된 코드에서 헤더를 추가 할 메소드 (즉, 이미 속성을 추가 한 메소드와 동일한 메소드)를 복사하여 확장 섹션에 붙여 넣으십시오.

  3. 메소드 이름이 생성 된 코드의 이름과 충돌하지 않도록 약간 바꾸고 Invoke로 전달 된 이름을 일치하도록 변경하십시오. (메서드의 다른 특성을 조정하여 WSDL의 적절한 호출에 계속 매핑되도록해야 할 수도 있습니다.

  4. 사용자 지정 헤더 특성을 이름이 바뀐 메서드에 추가하고 헤더 인스턴스 필드를 확장 섹션뿐만 아니라.

  5. 원래 버전 대신 코드에서 이름이 변경된 버전을 호출하십시오.

WSDL에서 메서드 서명이 변경되지 않으면 다시 생성하더라도 코드에서 아무 것도 변경할 필요가 없습니다. (비교적 짧은 메소드 구현 만 복사하기 때문에 WSDL의 다른 구조는 여전히 생성 된 코드에서 나옵니다. 따라서 변경하면 다시 생성 할 때 자동으로 업데이트 된 버전을 가져옵니다. 다른 구조를 가지고 있다면이 유틸리티는 아마도 다소 제한적 일 것입니다.)

여전히 이상하지는 않지만 원시 XML 메시지를 가로 채고 직접 헤더를 넣으 려하지 않는 것이 좋습니다. 그것은 불쾌 할 것입니다.) 실제로 알고있는 다른 옵션은 없습니다 (어쨌든 WCF로 이동하지 않고).

3

사용중인 것 같습니다.Net 2.0 및 asmx 웹 서비스. .NET 3.0에는 WCF (Windows Communication Framework)라는 프레임 워크가 있다는 것을 알고 계십니까? 새로운 프레임 워크로 마이그레이션하는 것이 쉽지는 않지만 WCF를 사용하면 많은 것을 얻을 수 있습니다. WCf는 WebServices (remoting, msmq 등) 이상의 많은 용도로 사용할 수 있습니다. Microsoft가 미래에 내기를 걸고있는 프레임 워크입니다. 즉. 비누 헤더는 MessageContracts를 사용하여 처리됩니다.

그래서 대답은 WCF에서 MessageContracts로 할 수 있다는 것입니다.

+0

@khebbie : 저는 WCF를 처음 사용하고 맞춤 헤더도 설정하려고합니다. 메시지 계약은 갈 길처럼 들립니다. 이 자료를 읽을 수있는 훌륭한 자료를 알고 있습니까? – Adam

0

오늘이 문제가 발생했습니다. 자동 생성 된 클래스에서 파생 된 클래스를 만들고 내 머리글이 항상 존재하는지 확인하기 위해 GetWriterForMessage 메서드를 재정의했습니다. 메서드 호출 할 때마다 헤더 값을 업데이트합니다.

2

생성 된 클래스의 Beacuse는 부분 클래스입니다. 동일한 네임 스페이스와 클래스 이름 (다시 부분 클래스)을 사용하여 다른 파일에 정의 할 수 있습니다. 그런 다음 가상 메서드를 재정의하고 한 번 정의 할 수 있습니다.

이렇게하면 다시 생성 된 클래스의 변경 사항이 사용자가 작성한 클래스에 영향을 미치지 않습니다.

새 클래스 파일에서 "GetWriterForMessage"를 사용하여 새 SOAP 헤더를 무시하고 추가 할 수 있습니다.

public partial class SampleService 
{ 
    public string MessageID { get; set; } 

    protected override System.Xml.XmlWriter GetWriterForMessage(System.Web.Services.Protocols.SoapClientMessage message, int bufferSize) 
    { 
     message.Headers.Add(new UsernameSoapHeader("Username")); 
     message.Headers.Add(new PasswordSoapHeader("Password")); 
     message.Headers.Add(new MessageIDSoapHeader(MessageID)); 
     return base.GetWriterForMessage(message, bufferSize); 
    } 
} 
관련 문제