远程服务器返回意外响应:(502) Azure WCF 中的网关错误

本文关键字:WCF Azure 错误 网关 服务器 返回 意外 响应 | 更新日期: 2023-09-27 18:35:07

我已经上传了一个具有以下合约的服务。

[ServiceContract]
public interface Service
{
  [OperationContract]
  void CreateThing(Thing thing);
  [OperationContract]
  List<Thing> RetrieveThings();
}

当我调用创建方法时,一切正常,实例是在数据库中创建的,我没有收到任何错误。但是,当我检索元素时,出现错误:

远程服务器返回意外响应:(502) 网关错误。

奇怪的是,当列表为空(数据库中没有元素)时,操作进行得很顺利。更奇怪的是,针对数据库的操作在服务器内部工作,如果我聚合元素的名称并将它们作为字符串发送出去或打包在类 Thing 的字符串属性中,它也可以工作!

这是它不起作用时的样子:

public List<Thing> RetrieveThings()
{
  List<Thing> output;
  using (Context context = new Context())
    output = context.Things.ToList();
  return output;
}

这是它工作时的样子:

public List<Thing> RetrieveThings()
{
  List<Thing> output = new List<Thing>();
  using (Context context = new Context())
    foreach (Thing thing in context.Things.ToList())
      output.Add(new Thing {Id = thing.Id, Name = thing.Name});
  return output;
}

我在这里做什么不同(在引擎盖下而不是有意识地)?显然我可以访问数据库,并且我有特权。我也可以阅读所有信息。尽管如此,出于某种原因,我必须创建对象的副本。我需要逐个执行此操作,而不是使用 LINQ 查询。很困惑...

远程服务器返回意外响应:(502) Azure WCF 中的网关错误

我认为这可能与序列化有关。

context.Things.ToList()

此代码看起来像您正在从服务发送实体对象。尝试使用 POCO 而不是使用"事物"界面怎么样?或者,您可以强制转换/转换对象并返回它?

context.Things.ToList()ToAnotherPlainClass()

您的"Thing"类只有两个属性吗?你能这样返回而不循环吗?

public List<Thing> RetrieveThings()
{
  List<Thing> output;
  using (Context context = new Context())
    output = (from t in context.Things
               select new Thing() {
                  Id = t.Id, Name = t.Name
               }
             ).ToList();
  return output;
}

你在MSDN上检查过这个吗?我还没有测试过它,但似乎你需要应用[ApplyDataContractResolverAttribute].

在我的大多数项目中,我曾经创建与实际实体不同的响应模型,所以我没有遇到您现在遇到的问题。如果你还没有尝试过ApplyDataContractResolverAttribute,我会说你应该尝试一下。