2012-07-04 56 views
3

我一直在试图解决我的问题与此answer,但我没有运气。总的来说,我创建了一个WCF项目,其中有许多我想通过AJAX访问的函数(通过我的html页面中的javascript)。Ajax请求WCF数据(以JSON格式),但成功的消息到达错误

这里是我的Web服务中的函数的例子:
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); 
     } 
    }); 
} 

我打的错误部分,但奇怪的是有一个成功的错误信息......

Error Message

我本来以为这个问题是因为从外部API的JSON格式不正确,但我试着改变我的web服务来返回一些完全有效的JSON,并显示相同的错误。就像我之前提到的,我试图改变我的web服务来返回流,但我没有运气。

任何与此有关的帮助将不胜感激,我将非常感激。

更新

附:它似乎在WCF测试客户端中正常工作,返回一个字符串与我所期望的。
PPS只是增加了一个参数的误差函数来获得它的地位,我越来越parsererror PPPS传递给误差第三个参数是jquery171014696656613195724_1341477967656 was not called

+0

哪里是GetStuff方法的实现,以解决这一问题? –

+0

我的歉意!通过复制不同的功能! – ThePower

回答

1

只是快速猜测:您使用WebInvokeAttribute但试图调用使用HTTP GET进行服务操作。 WebInvokeAttributeMethod财产的默认值是POSTMSDN)。尝试切换到WebGetAttribute

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

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

UPDATE

正如@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); 

或者刚刚设置的“数据类型”为“JSON”的时候进行AJAX调用。

+0

我刚刚尝试了这两种方法,不幸的是没有运气。它在WCF Test Client中按预期工作。 – ThePower

+0

@ThePower:我已经更新了我的答案。 Cheeso有一点;-) – volpav

+0

我原本是json,但我得到一个错误(400错误的请求),并在研究了错误后,普遍的共识是,如果打电话给外部服务,那么我不能使用json在它自己的和唯一的方法来解决这个问题是使用jsonp。 – ThePower

1

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

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

您确定要使用jsonp吗?

您可能能够通过使用dataType: 'json'

+0

当我自己使用json时,我得到一个400错误请求错误。仅限 – ThePower

+0

JSONP将负责CORS,跨域问题。 – fkerrigan

相关问题