我正在开发一个 wsdl webservice 来使用来自外部设备的调用。
Web 服务是用 C# 和 .NET Framework 3.5 编写的,我们使用 VS2012。
我的问题是来自设备的调用是用一个标题发送的,而肥皂动作中没有命名空间。
来自设备的示例调用:
POST http://10.32.4.138/wscheckbadge/badge.asmx HTTP/1.1
Host: 10.32.4.138
Connection: keep-alive
Keep-Alive: 300
Content-Type: text/xml;charset=UTF-8
Content-Length: 547
SOAPACTION : "heartBeat"
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:txn="http://timeAttnHost.mydomain.com"
xmlns:xsd="http://timeAttnHost.mydomain.com/xsd"><soapenv:Header /><soapenv:Body><txn:heartBeat
soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"><txn:timestamp
xsi:type="xsi:long">1381504799</txn:timestamp><txn:terminalId
xsi:type="xsi:string">PT65-9410</txn:terminalId></txn:heartBeat></soapenv:Body></soapenv:Envelope>
在此我们收到此错误:
“服务器无法识别 HTTP 标头 SOAPAction:heartBeat 的值。”
在 Fiddler 中,我编写了相同的调用,但更改了 soapaction:
SOAPACTION : "http://timeAttnHost.mydomain.com/heartBeat"
这顺利通过了。
这是我的代码:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Services;
namespace WSCheckBadge
{
[WebService(Namespace = "http://timeAttnHost.mydomain.com")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[System.ComponentModel.ToolboxItem(false)]
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line.
[System.Web.Script.Services.ScriptService]
public class Badge : System.Web.Services.WebService
{
private CheckBadge.Badges badges = null;
[WebMethod]
public CheckBadge.PayterTxnResponse heartBeat(long timestamp, string terminalid)
{
if (badges == null)
badges = new CheckBadge.Badges(Properties.Settings.Default.XamConnectionString);
return badges.heartBeat(timestamp, terminalid);
}
}
}
我无法更改设备调用它的方式,否则我会在soapaction 中添加命名空间。
有没有办法让我的网络服务消费调用呢?