在HTML页面

时间:2017-11-28 08:09:49

标签: javascript asp.net json ajax asmx

我想请求您帮助解决我在HTML页面上调用ASP.NET webservice方法的问题。代码非常简单,但通常不起作用。一般来说,因为我找到了一个浏览器 - IE 11,对女巫来说它运行正常。在每个其他浏览器上,webservice响应为空(XMLHttpRequest对象的status属性返回0而不是200)。有趣的是,如果我将方法地址(http://www.rpdp.hostingasp.pl/RPDPWebService.asmx/HelloWorld)直接放到任何浏览器的URL栏中,结果是正确的:< string xmlns =“http://tempuri.org/”> Hello World< /串取代。结论 - webservice运行良好,但我无法在JS代码中正确调用它的方法。 我已经阅读了关于此问题的多个讨论,并假设该问题与安全问题和跨域资源共享有关。所有这些都很有说服力,我尝试了许多技巧,但没有成功。我对这个问题很陌生,如果有人能告诉我在下面的代码中要改变什么以使其适用于每个浏览器,我将非常感激。

亲切的问候,

Piotrek

P.S。我在外部托管ASP.NET网络服务器上发布我的web服务,所以我不能改变它的(服务器)设置。

ASP.NET webservice:

namespace RPDP
{
    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    [System.Web.Script.Services.ScriptService]
    public class RPDPWebService : System.Web.Services.WebService
    {
        [WebMethod]
        public string HelloWorld()
        {
            return "Hello World";
        }
    }
}

在web.config.xml文件中,我添加了以下标记(第一个,第二个):

<webServices>
    <protocols>
        <add name="HttpSoap"/>
        <add name="HttpGet"/>
        <add name="HttpPost"/>
    </protocols>
</webServices>

<httpProtocol>
    <customHeaders>
        <add name="Access-Control-Allow-Headers" value="accept, content-type" />
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS" />
    </customHeaders>
</httpProtocol>

HTML页面,我称之为我的webservice方法:

<html>
<head>
  <script src="https://code.jquery.com/jquery-1.10.2.js"></script>  
  <script>
    function go()
    {   
        var req = new XMLHttpRequest();
        req.open("GET", "http://www.rpdp.hostingasp.pl/RPDPWebService.asmx/HelloWorld", true);

        req.onreadystatechange = function(){
            if ( req.readyState == 4) {
                if ( req.status >= 200 && req.status < 300 ||req.status == 304 ) {      
                    var returnData = req.responseText;
                    alert('Success! Returned data: ' + returnData);
                } else {
                    alert("Error; request.status = " + req.status);
                }
                req = null;
            };
        }

        req.send();
    }
</script>
</head>
<body onload="go();"></body>
</html>

1 个答案:

答案 0 :(得分:0)

查看以下博文:https://zqzhang.github.io/blog/2016/04/18/why-use-onload-in-cross-domain-ajax.html

它建议在执行跨域Ajax请求时使用onload onreadystatechange。{/ p>

问题是Access-Control-Allow-Origin已定义两次。