我正在尝试调用我的WCF服务,而我正在使用jQuery的AJAX。除非我弄错了,问题似乎是当我尝试以JSON格式恢复数据时。我不确定网址是否正确。
这是我的service.svc.cs。我想调用AddNewQuery
//------------------------------------------------------------------------------
// <copyright file="WebDataService.svc.cs" company="Microsoft">
// Copyright (c) Microsoft Corporation. All rights reserved.
// </copyright>
//------------------------------------------------------------------------------
using System;
using System.Collections.Generic;
using System.Data.Services;
using System.Data.Services.Common;
using System.Linq;
using System.ServiceModel.Web;
using System.Web;
using System.Net;
using System.Data.Objects;
using System.Data.Entity;
using System.Net.Http;
using System.Web.Http;
using System.Web;
using System.ServiceModel.Web;
namespace BRADAPI
{
[JSONPSupportBehavior]
[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class Service1 : System.Data.Services.DataService<BradOnlineEntities>
{
// This method is called only once to initialize service-wide policies.
public static void InitializeService(DataServiceConfiguration config)
{
HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.UseVerboseErrors = true;
config.SetServiceOperationAccessRule("AddNewQuery", ServiceOperationRights.All);
config.SetServiceOperationAccessRule("GetQueryByID", ServiceOperationRights.All);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
}
protected override void OnStartProcessingRequest(ProcessRequestArgs args)
{
base.OnStartProcessingRequest(args);
//Cache for a minute based on querystring
HttpContext context = HttpContext.Current;
HttpCachePolicy c = HttpContext.Current.Response.Cache;
c.SetCacheability(HttpCacheability.ServerAndPrivate);
c.SetExpires(HttpContext.Current.Timestamp.AddSeconds(60));
c.VaryByHeaders["Accept"] = true;
c.VaryByHeaders["Accept-Charset"] = true;
c.VaryByHeaders["Accept-Encoding"] = true;
c.VaryByParams["*"] = true;
}
[WebGet]
public IQueryable<tblContactQuery> GetQueryByID(Guid QueryID)
{
IQueryable<tblContactQuery> biglist = (from c in this.CurrentDataSource.tblContactQueries where c.QueryID.Equals(QueryID) select c);
return biglist;
}
[WebGet]
public IQueryable<tblContactQuery> AddNewQuery(string QueryText, string UserID)
{
// Make NULL to remove compile errors
Guid GUserID = Guid.Parse(UserID);
Guid QueryID = Guid.NewGuid();
tblContactQuery C = new tblContactQuery
{
QueryID = QueryID,
UserID = GUserID,
QueryText = QueryText,
};
try
{
this.CurrentDataSource.tblContactQueries.Add(C);
this.CurrentDataSource.SaveChanges();
return GetQueryByID(QueryID);
}
catch
{
return GetQueryByID(QueryID);
}
}
}
}
我的JS代码
function sendQuery() {
userId = $("#hdnUserId").val();
contactId = $("#hdnContactId").val();
txtQuery = $('#txtQuery').val();
var successFlag;
$.ajax({
url: url,
data: "UserID='" + userId + "'&" + "QueryText='" + txtQuery + "'&" + "ContactID='" + contactId + "'",
type: "GET",
async: false,
datatype: "json",
success: function (data) {
successFlag = 1;
},
error: function (data) {
successFlag == 0;
}
});
if (successFlag == 1) {
alert("Thank you, your query has been sent to a member of the Alf team");
$("#dialog").css("display", "false");
$("#dialog").dialog("close");
}
else if (successFlag == 0) {
alert("Query not sent to the ALF team");
$("#dialog").css("display", "false");
$("#dialog").dialog("close");
}
}
我的成功和错误阻止不会受到影响,因为它没有达到服务。所以这不是成功或失败。
有关更改网址的任何提示吗?
答案 0 :(得分:2)
网址值参数不由' '
分隔。使用encodeURIComponent(...)
正确转义参数。
而不是
data: "UserID='" + userId + "'&" + "QueryText='" + txtQuery + "'&" + "ContactID='" + contactId + "'"
试
data: "UserID=" + userId + "&QueryText=" + encodeURIComponent(txtQuery) + "&ContactID=" + encodeURIComponent(contactId),
此外,根据您的一个屏幕截图,您的网址似乎有误。在http://i.stack.imgur.com/KtFlv.png中,网址为http://stating1......com/alfapi/Service.svc/AddNewQuery?format=json?QueryText
。
这表示您的url
变量已包含查询,即http://stating1......com/alfapi/Service.svc/AddNewQuery?format=json
(?format=json
部分是您的网址参数中的一个查询,使用data
时应避免使用该查询来自$.ajax(...)
。
而是将其更改为
var url = 'http://stating1......com/alfapi/Service.svc/AddNewQuery';
....
$.ajax({
url: url,
// move format=json from your url variable to data: part
data: "format=json&UserID=" + encodeURIComponent(userId) + "&QueryText=" + encodeURIComponent(txtQuery) + "&ContactID=" + encodeURIComponent(contactId),
type: "GET",
async: false,
datatype: "json",
success: function (data) {
successFlag = 1;
},
error: function (data) {
successFlag == 0;
}
});