【问题标题】:Ajax requesting WCF data (in JSON format) but reaching error with success messageAjax 请求 WCF 数据(JSON 格式),但出现错误并显示成功消息
【发布时间】:2012-07-04 14:43:12
【问题描述】:

我一直在尝试解决这个 answer 的问题,但我没有运气。

总的来说,我创建了一个 WCF 项目,其中包含我想通过 AJAX 访问的许多函数(通过我的 html 页面中的 javascript)。

这是我的网络服务中的一个函数示例:
iService

[OperationContract]
[WebInvoke(ResponseFormat = WebMessageFormat.Json)]
string GetStuff();

服务

    public string GetStuff()
    {
        string url = string.Format("http://myapi.co.uk/api/mystuff");

        WebRequest myReq = WebRequest.Create(url);

        // Where USERNAME and PASSWORD are constants
        string usernamePassword = USERNAME + ":" + PASSWORD;
        CredentialCache mycache = new CredentialCache();
        mycache.Add(new Uri(url), "Basic", new NetworkCredential(USERNAME, PASSWORD));
        myReq.Credentials = mycache;
        myReq.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)));

        WebResponse wr = myReq.GetResponse();
        Stream receiveStream = wr.GetResponseStream();

        StreamReader reader = new StreamReader(receiveStream, Encoding.UTF8);
        string content = reader.ReadToEnd();

        return content;
    }

请注意,我也尝试过直接返回 Stream

转到我的 javascript 和 ajax!

function getData()
{
  jQuery.support.cors = true;

  $.ajax({
      type: "GET",
      url: "http://localhost:15574/Service1.svc/GetStuff",
      contentType: "application/json; charset=utf-8",
      dataType: "jsonp",
      success: function(result) {
         alert(result);
      },
      error: function(msg) {
        alert("Fail: " + msg.status + ":" + msg.statusText);
      }
   });
}

我点击了错误部分,但奇怪的是一条成功的错误消息......

我最初认为问题是因为来自外部 API 的 JSON 格式不正确,但我尝试更改我的 Web 服务以返回一些完全有效的 JSON,并显示了相同的错误。就像我也提到的那样,我尝试更改我的网络服务以返回 Stream,但我没有运气。

对此的任何帮助将不胜感激,我将不胜感激。

更新

附:它似乎在 WCF 测试客户端中工作正常,返回一个符合我期望的字符串。
P.P.S 刚刚在错误函数中添加了另一个参数以获取其状态,我得到parsererror P.P.P.S 传递给错误的第三个参数是jquery171014696656613195724_1341477967656 was not called

【问题讨论】:

  • GetStuff方法的实现在哪里?
  • 抱歉!复制了一个不同的函数!

标签: c# javascript ajax json web-services


【解决方案1】:

您的 jquery 代码中有 dataType : 'jsonp'。 这告诉 jQuery 将 callback=XXXX 附加到 URL。

此对话的服务器端需要将 JSON 结果包装在该回调中。 但是您的代码没有这样做。

你确定要jsonp吗?

您或许可以使用dataType: 'json' 解决此问题

【讨论】:

  • 只有 JSONP 会处理 CORS、跨域问题。
【解决方案2】:

只是一个快速的猜测:您正在使用WebInvokeAttribute,但尝试使用 HTTP GET 调用服务操作。 WebInvokeAttributeMethod 属性的默认值为 POST (MSDN)。尝试切换到WebGetAttribute

[OperationContract]
[WebGet(ResponseFormat = WebMessageFormat.Json)]
string GetStuff();

或者,您可以将WebInvokeAttributeMethod 属性设置为GET

更新

正如@Cheeso 所提到的,您得到的“解析错误”是由于 JavaScript 引擎无法解释您返回的数据,因为它只是一个普通的 JSON,它本身不是一个有效的表达式(想象一下你把它放在<script></script> 标签内。这显然是行不通的,这正是浏览器试图做的)。

您需要尊重callback 参数并包装您的响应,使其成为名称通过callback 参数传递的函数的参数:

// If the ASP.NET compatibility was enabled, you could safely use HttpContext.Current
// It's here just to demonstrate the idea
return string.Format("{0}({1});", HttpContext.Current.Request.QueryString["callback"], content);

或者在进行 AJAX 调用时将“dataType”设置为“json”。

【讨论】:

  • 我很快就尝试了这两种方法,不幸的是没有运气。它在 WCF 测试客户端中按预期工作。
  • 我最初将它作为 json,但我收到了一个错误(400 Bad Request),在研究了错误之后,普遍的共识是,如果调用外部服务,那么我不能使用 json就其本身而言,解决此问题的唯一方法是使用 jsonp。
  • 另外,在我的 WCF 服务代码中,HttpContext 为空。
  • @ThePower: HttpContext 为空,因为没有启用 ASP.NET 兼容性(我在代码中提到了这一点)。您需要使用 OperationContext 或启用 ASP.NET 兼容性 (MSDN)
  • @ThePower:WCF "404 Bad Request" 使用 WCF Trace Viewer (MSDN) 很容易解决。
猜你喜欢
  • 1970-01-01
  • 2017-07-26
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 2023-04-06
  • 1970-01-01
  • 2020-05-24
  • 2021-11-12
相关资源
最近更新 更多