使用jquery在ASP.net中使用WCF Rest服务

时间:2013-03-02 06:06:54

标签: asp.net-mvc wcf

我正在尝试使用jquery在asp.net项目中使用wcf rest api。这样做我做了:

  1. 创建WCF Rest服务源代码可以从here下载。
  2. 创建了一个ASP.Net项目,使用jquery来使用restAPI。源代码here
  3. 在ASP .Net项目中单击按钮我试图调用REST服务。但每次我遇到两个问题:

    1. 在TestHTML5.js中调用var jsondata = JSON.stringify(request);会抛出错误,指出“ Microsoft JScript运行时错误:'JSON'未定义

    2. 当我按下ignore时,它继续向WCF Rest API调用但它总是返回错误(Not Found)函数。 Rest API永远不会被调用。

    3. 提前感谢每个人的帮助。


      解答: 可在此link上找到解决方案和来源链接。

2 个答案:

答案 0 :(得分:1)

您是否添加了此引用?

script type="text/javascript" src="../../json.js"></script> 

我遇到同样的问题并搜索thisresult

答案 1 :(得分:1)

我查看了您提供的示例代码,问题是您违反了same origin policy restriction。您无法执行跨域AJAX调用。在您的示例中,服务托管在http://localhost:35798上,而Web应用程序在http://localhost:23590上调用它是不可能的。您必须在同一个ASP.NET项目中托管服务和调用应用程序。您似乎尝试使用($.support.cors = true;)在客户端启用CORS,但您的服务不支持CORS。

您的调用页面(TestHTML5.htm)看到的另一个问题是您已经包含了两次jquery(一旦缩小版本和标准版本一次),并且您已经包含了脚本(TestHTML5.js) jQuery的。您应该修复脚本引用。另一个问题是以下行<script type="text/javascript"/>无效。

首先修复标记(我已经删除了标记中的所有CSS噪音,以便专注于重要部分):

<!DOCTYPE html>
<html dir="ltr" lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title>SignUp Form</title>
    <script type="text/javascript" src="../Scripts/jquery-1.7.2.min.js"></script>
    <script type="text/javascript" src="../Scripts/TestHTML5.js"></script>
</head>
<body>
    <button id="Send" onclick="testHTML5OnClick();">
        Send Me ID!
    </button>
</body>
</html>

然后在你的TestHTML5.js你也可以清理一下。例如,您的服务正在侦听以下网址格式json/{id}并仅接受GET谓词,并且您正在尝试使用不可能的POST。除此之外,您正在尝试使用JSON.stringify方法,该方法对GET动词没有任何意义。您只需将id作为您在服务中定义的url部分的一部分发送。

function testHTML5OnClick() {
    var id = 5;
    var url = "../RestServiceImpl.svc/json/" + id;
    var type = 'GET';
    callLoginService(url);
}

function callLoginService(url, type) {
    $.ajax({
        type: type,
        url: url,
        success: serviceSucceeded,
        error: serviceFailed
    });
}

function serviceSucceeded(result) {
    alert(JSON.stringify(result));
}

function serviceFailed(result) {
    alert('Service call failed: ' + result.status + '' + result.statusText);
}