【发布时间】:2018-03-07 17:23:35
【问题描述】:
首先,为这个问题道歉。让我先写,我已经尝试使用以下代码调用SOAP Web 服务,使用C# 完美运行。现在我坚持将代码转换为VB.NET:
public void CallService(string username, string password)
{
HttpWebRequest request = CreateSOAPWebRequest();
XmlDocument SOAPReqBody = new XmlDocument();
SOAPReqBody.LoadXml(@"<?xml version=""1.0"" encoding=""utf-8""?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV=""http://schemas.xmlsoap.org/soap/envelope/"">
<SOAP-ENV:Header>
<wsse:Security xmlns:wsse=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"">
<wsse:UsernameToken>
<wsse:Username>" + username + @"</wsse:Username>
<wsse:Password>" + password + @"</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<OTA_PingRQ xmlns=""http://www.opentravel.org/OTA/2003/05"" EchoToken=""abc123"" TimeStamp=""2016-07-12T10:00:29.0Z"" Version=""1"">
<EchoData> Hello World </EchoData>
</OTA_PingRQ>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>");
using (Stream stream = request.GetRequestStream())
{
SOAPReqBody.Save(stream);
}
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
using (WebResponse Serviceres = request.GetResponse())
{
using (StreamReader rd = new StreamReader(Serviceres.GetResponseStream()))
{
var ServiceResult = rd.ReadToEnd();
lblMsg.Text = ServiceResult;
}
}
}
public HttpWebRequest CreateSOAPWebRequest()
{
HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(@"https://cmtpi.siteminder.com/pmsxchangev2/services/CITRUS");
Req.Headers.Add(@"SOAP:Action");
Req.ContentType = "text/xml;charset=\"utf-8\"";
Req.Accept = "text/xml";
Req.Method = "POST";
return Req;
}
上面是一个工作代码,我的问题是当我尝试将其转换为VB.NET 时,引号甚至 Import 关键字(而不是@987654334 中的using @) 显示错误如下:我不是 VB.NET 的专家,只是希望一些指导可以使它工作(谷歌搜索但无法找到合适的解决方案)
Public Sub CallService(ByVal username As String, ByVal password As String)
Dim request As HttpWebRequest = CreateSOAPWebRequest()
Dim SOAPReqBody As XmlDocument = New XmlDocument()
SOAPReqBody.LoadXml("<?xml version=""1.0"" encoding=""utf-8""?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http:schemas.xmlsoap.org/soap/envelope/"">
<SOAP-ENV:Header>
<wsse:Security xmlns:wsse=""http:'docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"">
<wsse:UsernameToken>
<wsse:Username>" + username + "</wsse:Username>
<wsse:Password>" + password + "</wsse:Password>
</wsse:UsernameToken>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
<OTA_PingRQ xmlns=""http:'www.opentravel.org/OTA/2003/05"" EchoToken=""abc123"" TimeStamp=""2016-07-12T10:00:29.0Z"" Version=""1"">
<EchoData> Hello World </EchoData>
</OTA_PingRQ>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>")
Imports (Stream stream = request.GetRequestStream())
{
SOAPReqBody.Save(Stream)
}
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
Imports (WebResponse Serviceres = request.GetResponse())
{
Imports (StreamReader rd = New StreamReader(Serviceres.GetResponseStream()))
{
Dim ServiceResult As Var = rd.ReadToEnd()
Console.WriteLine(ServiceResult)
Console.ReadLine()
}
}
End Sub
Public Function CreateSOAPWebRequest() As HttpWebRequest
Dim Req As HttpWebRequest = CType(WebRequest.Create("https://cmtpi.siteminder.com/pmsxchangev2/services/CITRUS"), HttpWebRequest)
Req.Headers.Add("SOAP:Action")
Req.ContentType = "text/xml;charset=\"utf-8\""
Req.Accept = "text/xml"
Req.Method = "POST"
Return Req
End Function
【问题讨论】:
-
我尝试过另一个,但失败了。以上方法可行吗?
-
何不试试呢,只需要几秒钟?顺便说一句,您从哪里得知在 VB.NET 中相当于 C# 的
using是Import或Imports? AFAIK 相当于Using。 docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/…, docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/… -
converter.telerik.com 你的两个函数都转换了。
-
除了使用 & 代替 + 进行连接外,在 vb 和 c# 中声明字符串的方式没有太大区别。您可能需要使用 &_ 连接多行代码。您可以在语言文档中轻松查找所有这些语法