2009-09-15 68 views
2

我编写了一个简单的ASP.NET WebService预编译并将其托管在虚拟目录中。如果我用这个功能在同一个IP那么它将按预期工作托管的网页使用jQuery调用远程ASP.NET WebService

function SayHello() { 
    var serviceURL = "http://172.42.100.47/TestService/TestService.asmx/SayHello"; 
    var requestData = "{name:'" + $('#txtName').val() + "'}"; 

    $.ajax({ 
     type: 'POST', 
     contentType: 'application/json; charset=utf-8', 
     url: serviceURL, 
     data: requestData, 
     dataType: 'json', 
     success: function(result){ 
      alert(result.d); 
     } 
    }); 
} 

Webservice的代码:

namespace Test.Services 
{ 
    /// <summary> 
    /// Summary description for AgentService 
    /// </summary> 
    [WebService(Namespace = "http://tempuri.org/")] 
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] 
    [System.ComponentModel.ToolboxItem(false)] 
    [ScriptService] 
    public class TestService : System.Web.Services.WebService 
    { 
     [WebMethod] 
     [ScriptMethod(ResponseFormat=ResponseFormat.Json)] 
     public string SayHello(string name) 
     { 
      return "Hello, " + name; 
     } 
    } 
} 

Javascript代码访问该Web服务。但如果我从不同的IP访问它(例如:127.0.0.1),那么我在IE中获得“Permission Denied”,在FireFox中获得“404 Object Not Found”

如何使用可以从任何地方远程使用的ASP.NET编写Web服务,以及应该如何使用Javascript。

我找到的每个示例都引用了托管在同一项目目录中的WebService。

回答

2

您无法使用其他域的Web服务或任何Web资源(无法访问跨域Web服务)。您只能从您的域单独访问资源。

相反,您可以使用Dynamic Script TagJSONP黑客技术来实现这一目标。

+0

为此,从服务返回的数据应该使用JSON。我的web服务返回xml。 我写了一个HttpHandler,然后写了JSON到响应..它工作。 – Zuhaib 2009-09-15 13:36:49

+0

是的,这应该工作... :) – RameshVel 2009-10-08 08:57:37

0

在提供此Web服务的计算机上,确保Web服务器(IIS)允许远程连接。如果我没有弄错,开发Web服务器不允许远程连接,至少在默认情况下。

0

消费远程Web服务(不在同一网站域中)的最佳方式是通过PHP(或类似的服务器端脚本)传递请求。在PHP的情况下,你可以按照这个总的步骤:托管在example.com

  1. 你的HTML页面需要example2.com托管的远程服务。

  2. HTML页面托管在example.com消耗通过代理从位于同一example.com域中的PHP脚本阅读服务:

    $阿贾克斯({..bla ...,网址: '/phpscripts/proxy.php'});

  3. example.com上的/phpscripts/proxy是谁将使用CURL php库与example2.com进行通信。它将接收来自example2.com的html响应(或其他内容,取决于Web服务),然后将处理后的消息重新发送回您在example.com托管的html页面。您可以使用$.ajax对象中的,success(html){ }参数在example.com中捕获此响应。