0

我正在开发一个 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 中添加命名空间。

有没有办法让我的网络服务消费调用呢?

4

0 回答 0