更新2010年10月19日 我知道我刚才问过这个问题,但这些答案中显示的解决方法难以令人满意,对许多人来说,这仍然是一个常见的问题.WCF只是不灵活.我创建了自己的开源C#库,用于在没有WCF的情况下创建REST服务.检查restcake.net或rest.codeplex.com以获取有关所述库的信息. 结束更新
更新8/2/2012 ASP.NET Web API(以前是WCF Web API,REST WCF的替代品)默认情况下 使用Json.NET END UPDATE
在DataContractJsonSerializer无法处理许多情况下是Json.Net在正确配置(具体周期)处理就好了.
一个服务方法可以返回一个特定的对象类型(在这种情况下是一个DTO),在这种情况下DataContractJsonSerializer将使用它,或者我可以让该方法返回一个字符串,并自己使用Json.Net进行序列化.问题是当我返回一个json字符串而不是一个对象时,发送到客户端的json用引号括起来.
使用DataContractJsonSerializer,返回特定的对象类型,响应是:
{"Message":"Hello World"}
使用Json.Net返回json字符串,响应是:
"{\"Message\":\"Hello World\"}"
我不想在客户端上使用eval()或JSON.parse()结果,如果json以字符串形式返回,用引号括起来就是我必须要做的.我意识到这种行为是正确的; 这不是我想要/需要的.我需要原始的json; 当服务方法的返回类型是对象而不是字符串时的行为.
那么,我如何让我的方法返回一个对象类型,但不能使用DataContractJsonSerializer?我怎么能告诉它使用Json.Net序列化器呢?
或者,有没有直接写入响应流?所以我可以自己退回原始的json?没有包装报价?
这是我的人为例子,供参考:
[DataContract]
public class SimpleMessage
{
[DataMember]
public string Message { get; set; }
}
[ServiceContract]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class PersonService
{
// uses DataContractJsonSerializer
// returns {"Message":"Hello World"}
[WebGet(UriTemplate = "helloObject")] …Run Code Online (Sandbox Code Playgroud) 我本周遇到的一种情况:我们有一个jQuery Ajax调用,它返回服务器以获取数据
$.ajax(
{
type: "POST",
contentType: "application/json; charset=utf-8",
url: fullMethodPath,
data: data,
dataType: "json",
success: function(response) {
successCallback(response);
},
error: errorCallback,
complete: completeCallback
});
Run Code Online (Sandbox Code Playgroud)
fullMethodPath是指页面上静态方法的链接(比方说/MyPage.aspx/MyMethod).
public partial class MyPage : Page
{
// snip
[WebMethod]
public static AjaxData MyMethod(string param1, int param2)
{
// return some data here
}
}
Run Code Online (Sandbox Code Playgroud)
这个工作,没问题.
一位同事试图用类型为"GET"的那个替换这个电话.它坏了,我不得不解决它.最后,我回到POST,因为我们需要快速修复,但它一直在困扰我,因为在这种情况下,语义上GET更"正确".
据我所知,jQuery将数据中的对象转换为查询字符串:/MyPage.aspx/MyMethod?param1=value1¶m2=value2但我可以得到的只是页面的内容MyPage.aspx.
这只是Page方法的"功能",还是有办法使GET请求有效?
HTML
<a onclick="testGetParametersDynamic2();">fill in names and check it out</a>
<br />
<p>Enter First Name</p>
<input id="myFirstName" type="text" />
<br />
<p>Enter Last Name</p>
<input id="myLastName" type="text" />
<div id="outputGET3"></div>
Run Code Online (Sandbox Code Playgroud)
C#
[WebMethod(EnableSession = true)]
[ScriptMethod(UseHttpGet = true)]
public string testGetParametersDynamic(string firstName, string lastName)
{
string fullName = firstName + lastName;
return fullName;
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试了多种输入数据的方法bc我认为这就是问题所在
尝试1
function testGetParametersDynamic2()
{
$.ajax(
{
post: 'GET',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
data: '{"firstName":"' + $('#myFirstName').val() + '","lastName":' +
$('#myLastName').val() + '"}',
url: 'UtilitieService.asmx/TestGetParametersDynamic',
success: function …Run Code Online (Sandbox Code Playgroud) 我想使用ajax和jquery将表单发布到.asmx webservice,并将Webservice中的值作为JSON返回.
我正在使用ASP.NET 4.0.我知道为了从Web服务返回JSON,需要设置以下内容:(1)dataType:"json"(2)contentType:"application/json; charset = utf-8",(3)type:"POST" (4)将数据设置为某物.我测试了这个并且它工作正常(即我的webservice将数据作为JSON返回)如果所有**四都设置**.
但是,让我说在我的情况下我想做一个标准的表单帖子,即test1 = value1&test2 = value2所以contentType不是JSON但我想要回JSON {test1:value1}.这似乎不起作用,因为contentType是" application/x-www-form-urlencoded "而不是" application/json; charset = utf-8 ".
谁能告诉我为什么我不能这样做?我必须明确发送JSON以获取JSON,但如果你不使用JSON(即发布urlencoded contenttype),那么webservice将返回XML.
非常感谢任何见解:)
我正在使用JQuery Validation插件.我正在使用远程选项拨打我的网络服务来检查公司名称是否存在.Web服务仅接受JSON数据.
我将数据从我的表单中的公司输入字段传递到Web服务,如下所示:
数据:"{'company':'"+ $('#Company').val()+"'}"
但这总是为公司返回一个空白值,因此响应为{'company':''}即正确的JSON但缺少公司输入字段值.
任何人都可以解释为什么我总是在这里得到一个空白值?
谢谢你的帮助,Ciaran