供jQuery使用的WCF服务:适用于VS dev服务器,但不适用于IIS

时间:2012-10-21 22:34:56

标签: jquery asp.net json wcf web-services

这让我今天疯了。希望有人可以帮助我破解它。

基本上,我已经创建了一个测试站点,其中包含一个由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>"
                });
            }
        );
    }

我在发布之前已经搜索过,但还没有找到解决问题的方法 - 甚至还有帮助。

有人可以帮忙吗?

2 个答案:

答案 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错误的请求错误!

我不完全确定为什么这会解决这个问题 - 但我很高兴它确实存在!