C# 从.Net Core 2.0调用SOAP api时出错
我们使用.NETCore2.0版本调用外部SOAP服务 相关调用方法为:C# 从.Net Core 2.0调用SOAP api时出错,c#,asp.net-core,soap,asp.net-core-2.0,C#,Asp.net Core,Soap,Asp.net Core 2.0,我们使用.NETCore2.0版本调用外部SOAP服务 相关调用方法为: public async void Login(/*string username, string password*/) { try { OBASEMDMClient client = new OBASEMDMClient(); var loginCredential = new LoginCredential { UserNameO
public async void Login(/*string username, string password*/)
{
try
{
OBASEMDMClient client = new OBASEMDMClient();
var loginCredential = new LoginCredential
{
UserNameOrEMail = "username",
Password = "password"
};
var response = await client.LoginAsync(loginCredential);
}
catch (Exception e )
{
throw e;
}
}
我们得到的答复是:
接收对的HTTP响应时出错http:///OBASEMDM.svc.
这可能是由于服务端点绑定未使用HTTP协议造成的。
这也可能是由于服务器中止了HTTP请求上下文(可能是由于服务关闭)
但是当我们使用SOAPUI来校准服务时,我们得到了成功的响应:
SOAPUI请求:
这是相关服务的WSDL架构:
我们如何使用.Net Core 2.0调用此服务?
async void
在事件处理程序之外是fire and forget
参考文献
这可能就是上下文可能超出范围并中止的原因
应该重构该方法以返回Task
public async Task LoginAsync(string username, string password) {
try {
OBASEMDMClient client = new OBASEMDMClient();
var loginCredential = new LoginCredential {
UserNameOrEMail = username,
Password = password
};
var response = await client.LoginAsync(loginCredential);
//...
} catch (Exception e ) {
throw e;
}
}
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
<s:Body>
<LoginResponse xmlns="http://tempuri.org/">
<LoginResult xmlns:a="http://schemas.datacontract.org/2004/07/OBase.MDM.Entity" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<a:Data i:type="b:string" xmlns:b="http://www.w3.org/2001/XMLSchema">session-token</a:Data>
<a:Message>İşlem başarı ile tamamlandı.
Login: 0,0069797Persistent login has been used</a:Message>
<a:Result>true</a:Result>
<a:ResultCode>300</a:ResultCode>
</LoginResult>
</LoginResponse>
</s:Body>
</s:Envelope>
static void ConfigureEndpoint(System.ServiceModel.Description.ServiceEndpoint serviceEndpoint, System.ServiceModel.Description.ClientCredentials clientCredentials)
{
serviceEndpoint.Binding = new BasicHttpBinding();
serviceEndpoint.Binding.Name = "BasicHttpBinding_IOBASEMDM";
serviceEndpoint.Address = new EndpointAddress("http://<address>/OBASEMDM.svc");
}
public async Task LoginAsync(string username, string password) {
try {
OBASEMDMClient client = new OBASEMDMClient();
var loginCredential = new LoginCredential {
UserNameOrEMail = username,
Password = password
};
var response = await client.LoginAsync(loginCredential);
//...
} catch (Exception e ) {
throw e;
}
}