1

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

基本上,我创建了一个带有 WCF 服务的测试站点,供 jQuery 使用。它具有三种方法,其中两种方法完美。

该服务返回 JSON。它具有三种方法,其中两种方法完美。第三个没有 - 我不明白为什么。

这是我所知道的。

如果我从 Visual Studio 启动站点,我可以浏览到服务并查看格式化的 JSON。如果我尝试在浏览器(即 IIS 版本)中执行相同操作,则会收到 400 错误。但仅适用于一种方法 - 其他方法都很好。

正是这种不一致让我感到困惑。

我已将其设置为 IIS 中的网站,而不是虚拟目录。要浏览到它,URL 的格式为http://mytestsite.local

经过演练(我已经有一段时间没有完成任何 WCF 工作了!),我采取了从 web.config 中删除与服务相关的配置信息的方法。相反,我有一个引用 .svc 文件中的类 WebServiceHostFactory 的 Factory 属性。

以下是方法:

    [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>"
                });
            }
        );
    }

我在发布之前进行了搜索,但还没有找到任何解决问题的方法——甚至没有帮助。

任何人都可以帮忙吗?

4

2 回答 2

1

这给了我类似情况的结果......

网页配置

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
    <standardEndpoints>
      <webHttpEndpoint>
         <standardEndpoint name="" helpEnabled="true" automaticFormatSelectionEnabled="true" defaultOutgoingResponseFormat="Json" />
      </webHttpEndpoint>
    </standardEndpoints>
  </system.serviceModel>

GS挑战定义

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
 public class GSChallenge 
于 2012-10-22T00:30:46.310 回答
0

看起来我可能偶然发现了原因;我将数据库中的一个字段从 nchar(10) 更改为 nvarchar(10)。嘿 presto:不再出现 400 错误请求错误!

我不完全确定为什么这解决了问题 - 但我很高兴它解决了!

于 2012-10-22T11:10:00.280 回答