这让我今天疯了。希望有人可以帮助我破解它。
基本上,我已经创建了一个测试站点,其中包含一个由jQuery使用的WCF服务。它有三种方法,其中两种方法完美无缺。
该服务返回JSON。它有三种方法,其中两种方法完美无缺。第三个没有 - 我不明白为什么。
这就是我所知道的。
如果我从Visual Studio启动该站点,我可以浏览该服务并查看格式化的JSON。如果我尝试在浏览器中执行相同操作,即IIS版本,则会出现400错误。但只针对一种方法 - 其他方法都很好。
这就是让我难以理解的不一致。
我已将其设置为IIS中的网站,而不是虚拟目录。要浏览它,网址的格式为http://mytestsite.local
跟着一个演练(自从我完成任何WCF工作已经有一段时间了!),我采取了从web.config中删除与服务相关的配置信息的方法。相反,我有一个Factory属性引用.svc文件中的类WebServiceHostFactory。
以下是方法:
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json)]
public UserDTO[] GetUsers()
{
using (var dbContext = new GSChallengeContext())
{
var results = from u in dbContext.Users
select new UserDTO()
{
UserId = u.UserId,
Forename = u.Forename,
Surname = u.Surname,
};
return results.ToArray();
}
}
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json)]
public UserDTO[] GetUserById(int userId)
{
using (var dbContext = new GSChallengeContext())
{
var results = from u in dbContext.Users
where u.UserId == userId
select new UserDTO()
{
UserId = u.UserId,
Forename = u.Forename,
Surname = u.Surname,
DateOfBirth = (DateTime)u.DateOfBirth
};
return results.ToArray();
}
}
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json)]
public VehicleDTO[] GetVehiclesByUserId(int userId)
{
using (var dbContext = new GSChallengeContext())
{
var results = from v in dbContext.Vehicles
where v.UserId == userId
select new VehicleDTO()
{
VehicleId = v.VehicleId,
UserId = v.UserId,
Registration = v.Registration,
Alias = v.Alias,
Disabled = v.Disabled
};
return results.ToArray();
}
}
这是拨打电话的代码:
function ShowUserVehicleInfo()
{
var userId = $("#users").val();
var outStr = "";
$.getJSON('Services/GSChallenge.svc/GetVehiclesByUserId?userId=' + userId,
function (data) {
$.each(data, function (index, elem) {
outStr += "<div class=\"vehicleData\">" +
"<p>Registration: " + elem.Registration + "</p>" +
"<p>Alias: " + elem.Alias + "</p>" +
"<p>Disabled: " + elem.Disabled + "</p>" +
"</div>"
});
}
);
}
我在发布之前已经搜索过,但还没有找到解决问题的方法 - 甚至还有帮助。
有人可以帮忙吗?
答案 0 :(得分:1)
这给了我类似场景的结果......
的Web.config
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
<standardEndpoints>
<webHttpEndpoint>
<standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" defaultOutgoingResponseFormat="Json" />
</webHttpEndpoint>
</standardEndpoints>
</system.serviceModel>
GSChallenge定义
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class GSChallenge
答案 1 :(得分:0)
看起来我可能偶然发现了原因;我将数据库中的一个字段从nchar(10)更改为nvarchar(10)。嘿presto:没有400错误的请求错误!
我不完全确定为什么这会解决这个问题 - 但我很高兴它确实存在!