我为现有客户端创建了一个asmx服务。该服务在 SOAP UI 中工作正常,但从外部客户端调用时,输入参数变为空。我尝试使用 httpWebRequest 从控制台应用程序调用该服务(不添加服务引用(,问题仍然存在。这似乎仅在通过 https 调用服务时才会发生。奇怪的是,肥皂头参数来得正好。客户端将 SoapAction 作为空发送,因此无法修改,因此使用
[SoapDocumentMethodAttribute(Action = "")]
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Validate : System.Web.Services.WebService
{
private WSSEDraftSecurityHeader _security;
public WSSEDraftSecurityHeader Security
{
get { return _security; }
set { _security = value; }
}
[WebMethod]
[SoapDocumentMethodAttribute(Action = "")]
[SoapHeader("Security", Direction = SoapHeaderDirection.InOut)]
public ValidateResponse.validateResult validate(DateTime dt, string ac, string tc, string ot, string o, int sn, string bpb)
{
}
}
肥皂请求是:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <s:Header> <o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> <o:UsernameToken u:Id="uuid-9b091270-fad3-4cf7-bef5-58b9a57ed37e-9"> <o:Username>XXXXX</o:Username> <o:Password>iiiiii</o:Password> </o:UsernameToken> </o:Security> </s:Header> <s:Body> <validate xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://tempuri.org/"> <ac>SN</ac> <bpb>TTFD</bpb> <o>PXPXS1</o> <ot>port</ot> <sn>0</sn> <tc>T2</tc> <dt>2019-04-17T18:50:36.3259364+08:00</dt> </validate> </s:Body> </s:Envelope>
正在调用 Web 方法并通过安全标头验证。但是所有字符串参数都为 null,一个日期时间参数的默认日期为 01/01/0001
也许问题出在 Soap 请求中参数的顺序上,因为它们的列出顺序与方法声明中的顺序不同。我会比较 SoapUI 和控制台应用程序生成的 SOAP 请求,然后找到差异。