【问题标题】:SOAP request object containing null values包含空值的 SOAP 请求对象
【发布时间】:2023-03-03 21:53:01
【问题描述】:

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

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

[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)不为空,但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 生成的,没有被修改。可能是什么原因?

【问题讨论】:

  • 你是如何在 .net core 中实现 SOAP 服务的?与我们分享.net 核心中的soap 服务。你关注Custom ASP.NET Core Middleware Example吗?
  • 我正在使用一个名为 SoapCore 的 NuGet 包。它需要您做的就是在配置期间添加 SOAP 服务,如下所示:(在 ConfigureServices 中)ˋservices.AddSingleton();ˋ(在 Configure 中)ˋapp.UseSoapEndpoint("/ServicePath.svc", new BasicHttpBinding());ˋ
  • 服务定义是什么?与我们分享与服务相关的代码。

标签: soap asp.net-core wsdl soapui


【解决方案1】:

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

答案是:

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

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

为此:

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

那个解决方案对我有用。

【讨论】:

  • XmlSerializer -> 通过 wsdl.exe DataContractSerializer 生成的接口/类 -> 通过 svcutil XmlSerializer 或 DataContractSerializer 生成 -> 通过 dotnet-svcutil 生成,具体取决于使用的开关
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2014-08-05
  • 1970-01-01
  • 2018-12-23
  • 2017-10-06
  • 1970-01-01
相关资源
最近更新 更多