包含空值的SOAP请求对象

时间:2018-10-24 08:42:06

标签: soap asp.net-core wsdl soapui

我正在尝试在ASP.NET Core中实现SOAP Web服务。我使用dotnet svcutil生成了代理代码,并使用SoapUI生成了一个示例请求。

问题在于,每当我尝试将请求发布到服务中时,我得到的请求对象都不为null,而是所有值。具体来说,我正在使用此类的对象对其进行测试:

[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")]
[System.ComponentModel.EditorBrowsableAttribute(System.ComponentModel.EditorBrowsableState.Advanced)]
[System.ServiceModel.MessageContractAttribute(WrapperName="riceviPrenotazione", WrapperNamespace="http://farpresa.esterni.ised.it/", IsWrapped=true)]
public partial class riceviPrenotazioneRequest
{

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://farpresa.esterni.ised.it/", Order=0)]
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public prenotazione arg0;

    [System.ServiceModel.MessageBodyMemberAttribute(Namespace="http://farpresa.esterni.ised.it/", Order=1)]
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
    public infoUtente arg1;

    public riceviPrenotazioneRequest()
    {
    }

    public riceviPrenotazioneRequest(prenotazione arg0, infoUtente arg1)
    {
        this.arg0 = arg0;
        this.arg1 = arg1;
    }
}

这是代理实现:

public class FederFarma : FarPreSaEsterniWs
{
    public Task<riceviPrenotazioneResponse> riceviPrenotazione(riceviPrenotazioneRequest request)
    {
        // code...
    }

    public Task<eliminaPrenotazioneResponse> eliminaPrenotazione(eliminaPrenotazioneRequest request)
    {
        // code...
    }

    public Task<verificaDisponibilitaResponse> verificaDisponibilita(verificaDisponibilitaRequest request)
    {
        // code...
    }
}

被调用的函数是第一个(riceviPrenotazione)。其参数(request不为null,但arg0arg1为空。

这是我的界面:

[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.3")]
[System.ServiceModel.ServiceContractAttribute(Namespace="http://farpresa.esterni.ised.it/", ConfigurationName="FarPreSaEsterniWs")]
public interface FarPreSaEsterniWs
{

    [System.ServiceModel.OperationContractAttribute(Action="http://farpresa.esterni.ised.it/FarPreSaEsterniWs/riceviPrenotazioneRequest", ReplyAction="http://farpresa.esterni.ised.it/FarPreSaEsterniWs/riceviPrenotazioneResponse")]
    [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
    System.Threading.Tasks.Task<riceviPrenotazioneResponse> riceviPrenotazione(riceviPrenotazioneRequest request);

    [System.ServiceModel.OperationContractAttribute(Action="http://farpresa.esterni.ised.it/FarPreSaEsterniWs/eliminaPrenotazioneRequest", ReplyAction="http://farpresa.esterni.ised.it/FarPreSaEsterniWs/eliminaPrenotazioneResponse")]
    [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
    System.Threading.Tasks.Task<eliminaPrenotazioneResponse> eliminaPrenotazione(eliminaPrenotazioneRequest request);

    [System.ServiceModel.OperationContractAttribute(Action="http://farpresa.esterni.ised.it/FarPreSaEsterniWs/verificaDisponibilitaRequest", ReplyAction="http://farpresa.esterni.ised.it/FarPreSaEsterniWs/verificaDisponibilitaResponse")]
    [System.ServiceModel.XmlSerializerFormatAttribute(SupportFaults=true)]
    System.Threading.Tasks.Task<verificaDisponibilitaResponse> verificaDisponibilita(verificaDisponibilitaRequest request);
}

这是我通过SoapUI发送的XML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:far="http://farpresa.esterni.ised.it/">
   <soapenv:Header/>
   <soapenv:Body>
      <far:riceviPrenotazione>
         <!--Optional:-->
         <arg0>
            <!--Optional:-->
            <anagrafica>
               <!--Optional:-->
               <cellulare>3333333333</cellulare>
               <codice>123</codice>
               <!--Optional:-->
               <codiceFiscale>RSSMRA01A00L885A</codiceFiscale>
               <!--Optional:-->
               <cognome>Rossi</cognome>
               <!--Optional:-->
               <comuneDiNascita>
                  <!--Optional:-->
                  <codice>L885</codice>
                  <!--Optional:-->
                  <descrizione>Vignola</descrizione>
                  <!--Optional:-->
                  <fiscale>L885</fiscale>
                  <!--Optional:-->
                  <nazione>
                     <!--Optional:-->
                     <codice>ITA</codice>
                     <!--Optional:-->
                     <descrizione>Italia</descrizione>
                     <!--Optional:-->
                     <fiscale>ITA</fiscale>
                  </nazione>
                  <!--Optional:-->
                  <provincia>MO</provincia>
                  <!--Optional:-->
                  <regione>
                     <!--Optional:-->
                     <codice>ER</codice>
                     <!--Optional:-->
                     <descrizione>Emilia-Romagna</descrizione>
                  </regione>
               </comuneDiNascita>
               <!--Optional:-->
               <domicilioCap>41057</domicilioCap>
               <!--Optional:-->
               <domicilioComune>
                  <!--Optional:-->
                  <codice>F257</codice>
                  <!--Optional:-->
                  <descrizione>Modena</descrizione>
                  <!--Optional:-->
                  <fiscale>F257</fiscale>
                  <!--Optional:-->
                  <nazione>
                     <!--Optional:-->
                     <codice>ITA</codice>
                     <!--Optional:-->
                     <descrizione>Italia</descrizione>
                     <!--Optional:-->
                     <fiscale>ITA</fiscale>
                  </nazione>
                  <!--Optional:-->
                  <provincia>MO</provincia>
                  <!--Optional:-->
                  <regione>
                     <!--Optional:-->
                     <codice>ER</codice>
                     <!--Optional:-->
                     <descrizione>Emilia-Romagna</descrizione>
                  </regione>
               </domicilioComune>
               <!--Optional:-->
               <domicilioIndirizzo>Via Finta, 12</domicilioIndirizzo>
               <!--Optional:-->
               <nome>Mario</nome>
               <!--Optional:-->
               <sesso>M</sesso>
            </anagrafica>
            <!--Optional:-->
            <codice>111</codice>
            <!--Optional:-->
            <!--Zero or more repetitions:-->
            <listaPrenotato>
               <!--Optional:-->
               <prestazione>
                  <!--Optional:-->
                  <codice>222</codice>
                  <!--Optional:-->
                  <codiceRegionale>222</codiceRegionale>
                  <!--Optional:-->
                  <descrizione>Niente di che</descrizione>
                  <!--Optional:-->
                  <specialita>Nullafacentismo</specialita>
               </prestazione>
               <prezzoUnitario>10</prezzoUnitario>
               <quantita>1</quantita>
            </listaPrenotato>
            <!--Optional:-->
            <NRE>080A01234567890</NRE>
            <!--Optional:-->
            <note>Boh</note>
            <prezzoTotale>10</prezzoTotale>
         </arg0>
         <!--Optional:-->
         <arg1>
            <!--Optional:-->
            <nomeUtente>username</nomeUtente>
            <!--Optional:-->
            <password>password</password>
         </arg1>
      </far:riceviPrenotazione>
   </soapenv:Body>
</soapenv:Envelope>

根据我在网上找到的内容,这似乎是一个名称空间问题,但是对我来说所有名称空间似乎都可以-SoapUI与自动生成的类一致,最重要的是它们是从同一WSDL生成的,未经修改。可能是什么原因?

1 个答案:

答案 0 :(得分:0)

看起来与github上提到的问题相同:https://github.com/DigDes/SoapCore/issues/79我假设您使用的是SoapCore的注释

答案为:

只需在启动时将DataContractSerializer更改为XmlSerializer:

app.UseSoapEndpoint<MyService>("/MyService.svc", new BasicHttpBinding(), SoapSerializer.DataContractSerializer);

为此:

app.UseSoapEndpoint<MyService>("/MyService.svc", new BasicHttpBinding(), SoapSerializer.XmlSerializer);

该解决方案对我有用。