새 응용 프로그램에 WCF를 사용하여 구현하려는 기존 SOAP 웹 서비스 인터페이스가 있습니다. 이것은 하나의 작은 세부 사항을 제외하고는 잘 작동하는 것 같습니다. 함수의 반환 유형의 XML 네임 스페이스는 웹 서비스 자체의 XML 네임 스페이스와 달라야합니다. 그리고 저의 삶을 위해, 나는 그것이 작동하도록 할 수 없습니다.WCF XML serialization을 사용자 지정하는 방법
작은 샘플 프로젝트에서 같은 문제를 재현했습니다. WCF 인터페이스 :
이[XmlSerializerFormat]
[ServiceContract(Namespace = "urn:outer-namespace")]
public interface IService1
{
[OperationContract]
MyClass DoStuff(int value);
}
[Serializable]
public class MyClass
{
[XmlElement(ElementName = "DataString")]
public string MyString { get; set; }
}
웹 서비스 구현 :
이 웹 서비스로부터의 응답이 다음과 같이 직렬화public class Service1 : IService1
{
public MyClass DoStuff(int value)
{
return new MyClass { MyString = "Wooh!" };
}
}
: 우리가 (생략 SOAP 물건)
<DoStuffResponse xmlns="urn:outer-namespace">
<DoStuffResult>
<DataString>Wooh!</DataString>
</DoStuffResult>
</DoStuffResponse>
그러나 원하는 <DoStuffResult>은 xmlns = "urn : inner-namespace"가되어야합니다.
나는 인터페이스 함수 나 웹 서비스 함수에 [return : XmlElement (...)]를 추가하려고 시도했지만 취하지는 않습니다. 또한 MyClass 클래스 정의에서 [XmlType] 또는 [XmlRoot]가 작동하지 않습니다.
누구나 WCF 웹 서비스 함수의 반환 값인 객체의 직렬화 된 XML 네임 스페이스 (또는 요소 이름)를 변경하는 방법을 알고 있습니까?
이미 질문에 명시된 것처럼, 나는 XmlRoot 속성을 추가 시도하고 그것은 작동하지 않았다. 네임 스페이스는 MyClass 내의 필드에만 추가되지만 MyClass 자체에는 추가되지 않습니다. DataContract도 작동하지 않으며 이름 바꾸기 때문에 XmlSerializer를 선호하므로 순서가 중요하지 않습니다. –
svcutil을 사용했지만 serializer를 지정하지 않고 XmlSerializer를 사용하여 MessageContract와 ServiceContract의 조합을 생성했습니다. 따라서 하나 또는 두 개의 래퍼가 있으며 XML 특성을 사용하여 모든 작업을 수행 할 수 있습니다. –