我正在尝试在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,但arg0
和arg1
为空。
这是我的界面:
[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生成的,未经修改。可能是什么原因?
答案 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);
该解决方案对我有用。