>source

참고 : 적어도 몇 개의 다른 StackOverflow 게시물 (예 : 여기 여기) 이것에 대해 비슷한 질문을하고 있지만 아무도 답을 얻지 못했기 때문에 나는 또 다른 소용돌이를 줄 것이라고 생각했습니다. :)

클라이언트의 Soap 1.1 wsdl 및 .xsd 스키마를 기반으로 .NET WCF 서비스를 만들려고합니다. 그들은 또한 샘플 입력을 제공했습니다 (내 예제에서 세부 사항이 변경되었지만 주요 문제는 여전히 여기에 있습니다).

MessageContracts를 빌드하기 위해 wsdl 및 xsd 파일에 대해 svcutil을 사용했으며 대부분 작동하지만 주어진 네임 스페이스로 모든 요소 를 한정하는 경우에만 작동합니다.

받은 예제 요청에서 네임 스페이스는 요청의 루트 요소에서만 정규화되었습니다.

생성 된 [XmlElement] 속성을 가지고 놀면서 Qualified, Unqualifed 및 None 사이에서 Form을 변경하고 Namespace를 ""로 변경하는 등 제가 생각할 수있는 다른 모든 것을 시도했지만 관리 할 수 ​​없습니다. Form= Qualified를 사용하고 실제로 모든 자식 요소에 네임 스페이스 접두사를 포함하지 않는 한 XML 파서가 전체 요청을 성공적으로 구문 분석하도록합니다.

질문 : 고객이 제공 할 정확한 입력을 허용하는 다른 속성 또는 이미 보유한 속성에 대한 기타 속성이 있습니까?

다음은 서비스 계약 선언 및 메시지 계약입니다.

[ServiceContract(Name="MyService", Namespace= "http://www.mywebsite.com/webservices/beans")]
[XmlSerializerFormat(Style= OperationFormatStyle.Document, Use= OperationFormatUse.Literal, SupportFaults= true)]
public interface IValidatePasswordService
{
    [OperationContract(Action="http://api.paysimple.com/sso/myRequest", Name="myRequest")]
    [XmlSerializerFormat(Style= OperationFormatStyle.Document, Use= OperationFormatUse.Literal, SupportFaults= true)]
    MyResponseMessage MyRequest(MyRequestMessage request);
}
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.ServiceModel", "4.0.0.0")]
[System.ServiceModel.MessageContractAttribute(IsWrapped=false)]
public partial class MyRequestMessage
{
    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://www.mywebsite.com/webservices/beans", Order=0)]
    [System.Xml.Serialization.XmlArrayItemAttribute("data", Form=System.Xml.Schema.XmlSchemaForm.Qualified, IsNullable=false)]
    public Data[] MyRequest;
    public MyRequestMessage()
    {
    }
}
[System.CodeDom.Compiler.GeneratedCodeAttribute("svcutil", "4.8.3928.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.mywebsite.com/webservices/beans")]
public partial class Data
{
    private string valueField;
    ///<remarks/>    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Qualified, Order=0)]
    public string value
    {
        get
        {
            return this.valueField;
        }
        set
        {
            this.valueField= value;
        }
    }
}

제공된 입력 예제는 다음과 같습니다.

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Body>    <bean:MyRequest xmlns:bean="http://www.mywebsite.com/webservices/beans">        <data><value>data1</value></data>        <data><value>data2</value></data>        <data><value>data3</value></data>    </bean:MyRequest></Body>

하지만이 요청을 사용하면 MyRequest 배열이 비어있는 MyRequestMessage가 표시됩니다. 그러나 다음과 같이 각 자식 요소에 "bean :"접두사를 추가하면 :

<Envelope xmlns="http://schemas.xmlsoap.org/soap/envelope/"><Body>    <bean:MyRequest xmlns:bean="http://www.mywebsite.com/webservices/beans">        <bean:data><bean:value>data1</bean:value></bean:data>        <bean:data><bean:value>data2</bean:value></bean:data>        <bean:data><bean:value>data3</bean:value></bean:data>    </bean:MyRequest></Body>

그런 다음 모든 입력 값을 얻습니다.

내가 시도 할 수있는 아이디어가 있습니까 (클라이언트가 요청하는 방식을 변경하도록 요청하는 것 외에)?

감사합니다!

WCF 서비스를 호출하기 위해 WSDL 파일을 기반으로 프록시 클래스를 생성하고 있습니까?

Ding Peng2021-03-19 16:07:26

@DingPeng 예,하지만 /messageContract 옵션 만 사용하고 여기에서 서비스를 만들고 있기 때문에 계약 클래스를 선택합니다.

anjhinz2021-03-19 16:07:26

자식 요소의 bean 요소를 제거 하시겠습니까? 나는 이것이 불필요하다고 생각한다. XML 올바른 네임 스페이스와 연결된 한 모든 접두사를 사용할 수 있도록 지정합니다.

Ding Peng2021-03-19 16:21:50

@dingpeng 당신이 맞습니다. 나는 클라이언트와 이야기했으며, 해당 가장 바깥 쪽 요소의 "bean :"접두사를 제외하도록 요청을 구성 할 수 있으며, 해당 문제를 해결할 수 있고 (자식 요소 유형의 네임 스페이스 속성을 빈 문자열로 설정하는 것과 함께) 문제를 해결했습니다. ...에

anjhinz2021-03-19 16:21:50
  • 이전 java : Spark 3.0.1 구조적 스트리밍이있는 Kafka : ClassException : org.apache.kafka.common.TopicPartition; 역 직렬화에 유효하지 않은 클래스
  • 다음 unity3d : 사기꾼으로부터 게임 보호