服务器未能识别 HTTP 标头 SOAPAction 的值

 

解决办法:服务器未能识别 HTTP 标头 SOAPAction 的值

本文主要探讨跨平台调用 Web Service 出现: " 服务器未能识别 HTTP 标头 SOAPAction 的值 " 的解决办法。

症状一:

Web Service + ASP.NET 应用程序部署到服务器默认目录中,在 IE 中用 http://< 服务器地址 >/< 程序目录名 >/< 默认启动页面名 > 发 生 “ 服务器未能识别 HTTP 标头 SOAPAction 的值 ” 错误。

症状二:

在 Java 平台上调用 .NET Web Service 的服务时,出现 " 服务器未能识别 HTTP 标头 SOAPAction 的值 " 。

症状三:

在 Java 平台下调用 .NET WEB Service ,出现数据时有时无。

解决对策:

给 .NET 的 WebService 类(即 .asmx 文件下的类)添加属性 [SoapDocumentService(RoutingStyle=SoapServiceRoutingStyle.RequestElement)]

以下是NET代码,

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;

namespace WebService
{
    /// <summary>
    /// Service1 的摘要说明
    /// </summary>
    [WebService(Namespace = "
http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [ToolboxItem(false)]
    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
    // [System.Web.Script.Services.ScriptService]
    [SoapDocumentService(RoutingStyle = SoapServiceRoutingStyle.RequestElement)]
    public class Service1 : System.Web.Services.WebService
    {

        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
        [WebMethod]
        public USER GetObj()
        {
            USER user = new USER();
            user.Name = "习明凡";
            user.Pass = "123456";
            return user;
        }
    }
}

小知识:

什么是 SoapAction ?它在 WSDL 中有何作用?

SOAPAction HTTP request header 被用来标识 SOAP HTTP 请求的目的地,其值是个 URI 地址。 SOAP 发送并不限制格式、 URI 特征或其必须可解析,那么在这种情况下,发送一个 HTTP SOAP 请求时,其 HTTP 客户端必须使用 / 指明 SOAPAction HTTP request header 。

SOAPAction header 的内容可以被用在服务端,诸如:防火墙适当的过滤基于 HTTP 的 SOAP 请求消息等场景。 SOAPAction header 的值为空串 ("") 表示 SOAP 消息的目的地由 HTTP 请求的 URI 标识;无值则表示没有指定这条消息的目的地。

java代码:


import org.apache.cxf.jaxws.JaxWsProxyFactoryBean;
import org.tempuri.Service1Soap;
import org.tempuri.USER;

public class Test {

public static void main(String[] args) {
  
   JaxWsProxyFactoryBean soapFactoryBean = new JaxWsProxyFactoryBean();
   soapFactoryBean.setAddress("
http://10.8.0.143/webservice/Service1.asmx");
   soapFactoryBean.setServiceClass(Service1Soap.class);
   Object o = soapFactoryBean.create();
   Service1Soap soap = (Service1Soap)o;
   System.out.println(soap.helloWorld());
  
   USER user = soap.getObj();
   System.out.println(user.getName());
}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值