Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WCF javascript跨域调用_Javascript_Wcf - Fatal编程技术网

WCF javascript跨域调用

WCF javascript跨域调用,javascript,wcf,Javascript,Wcf,我是javascript新手,我有一个问题让我很难过 我想在一个页面中添加一个跟踪javascript。此脚本将调用wcf服务来跟踪客户端浏览器信息、访问的页面和时间戳。问题是我在javascript调用中遇到了“405方法不允许”错误。该服务将位于另一个域上。现在我在本地主机上测试这个。该服务运行良好,因为我可以在浏览器的新页面上调用它。你经历过同样的问题吗?我怎样才能解决这个问题 我的javascript代码是: Wcf服务代码: [ServiceContract(Name = "Custo

我是javascript新手,我有一个问题让我很难过

我想在一个页面中添加一个跟踪javascript。此脚本将调用wcf服务来跟踪客户端浏览器信息、访问的页面和时间戳。问题是我在javascript调用中遇到了“405方法不允许”错误。该服务将位于另一个域上。现在我在本地主机上测试这个。该服务运行良好,因为我可以在浏览器的新页面上调用它。你经历过同样的问题吗?我怎样才能解决这个问题

我的javascript代码是:

Wcf服务代码:

[ServiceContract(Name = "CustomersAssistantService", Namespace = "CustomersAssistantService")]
public interface ICustomersAssistantService
{
    [OperationContract]
    [WebGet]
    string DoWork();

    [WebInvoke(Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
    [OperationContract]
    string Sum(int n1, int n2);
}

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CustomersAssistantService : ICustomersAssistantService
{
    public string DoWork()
    {
        return "work done";
    }

    public string Sum(int n1, int n2)
    {
        return (n1 + n2).ToString();
    }
}
Javascript调用:

function CallWcf1(){
        var _I = this;
        var url = "http://localhost:58399/CustomersAssistantService.svc/customersAssistantService/";        

            var methodUrl = _I.serviceUrl + 'dowork';

             $.ajax( {
                        url: methodUrl,
                        data: '',
                        type: "GET",
                        processData: false,
                        contentType: "application/json",
                        timeout: 10000,
                        dataType: "text",  // not "json" we'll parse
                        success: 
                        function(res) 
                        {                                    
                            if (!callback) return;
                            // *** Use json library so we can fix up MS AJAX dates
                            var result = JSON2.parse(res);
                            // *** Bare message IS result
                            if (bare)
                            { callback(result); return; }
                            // *** Wrapped message contains top level object node
                            // *** strip it off
                            for(var property in result)
                            {
                                callback( result[property] );
                                break;
                            }                    
                        },
                        error:  
                        function(xhr)
                        {
                            if (!error) return;
                            if (xhr.responseText)
                            {
                                var err = JSON2.parse(xhr.responseText);
                                if (err)
                                    error(err); 
                                else    
                                    error( { Message: "Unknown server error." })
                            }
                            return;
                        }
                    });   
    }
我做错什么了吗


非常感谢,据我所知,请求WCF必须使用POST方法,因此更改为:

type: "POST", 
在AJAX调用中。

您将遇到。Ajax请求仅限于与同一来源进行通信;跨域请求通常会被拒绝

根据您的需要,有多种方法:

  • 如果您的用户将只使用非常现代的浏览器(因此,不是IE7),那么您可以在服务器上实现。这是W3C的一个标准,允许服务器跨源开放对其资源的访问,但它仅在现代浏览器中受支持。(在IE上,它是受支持的,但不是通过通常的
    XMLHttpRequest
    对象;相反,您必须使用
    XDomainRequest
    对象。)
  • 您可以实现一个
  • 如果您只想向另一个域发送通知,您可以通过添加具有相关
    src
    属性的元素,从该域加载资源(一个
    img
    、一个
    script
    ,等等);不过,这意味着您仅限于使用本应用于幂等资源的
    GET
    方法

我也尝试过post,我有两种测试方法,一种是get,另一种是post。。。但我认为跨域调用存在问题。你知道谷歌跟踪代码是如何工作的吗?我假设它调用了一个服务来获取跟踪信息。@Radu:我刚才添加了一些要点,说明了您在评论时如何使用它。谷歌使用了第三个元素(一个
脚本
元素)。非常感谢。你救了我一天:)