gpt4 book ai didi

c# - WCF 服务返回带有匿名对象的 JSON

转载 作者:行者123 更新时间:2023-11-30 12:33:50 26 4
gpt4 key购买 nike

对于我正在构建的简单 API,我使用了几种技术。首先,这不是我创建的第一个 API,但它是第一个结合 WCF、json 和匿名对象的 API。

我得到了以下 WCF API 接口(interface):

[ServiceContract]
public interface IAPI
{
[OperationContract]
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.WrappedRequest,
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json)]
ServiceResponse Authenticate(string username, string hashedPassword);

[OperationContract]
[WebInvoke(Method = "POST",
BodyStyle = WebMessageBodyStyle.WrappedRequest,
ResponseFormat = WebMessageFormat.Json,
RequestFormat = WebMessageFormat.Json)]
ServiceResponse GetProducts();
}

这一切都非常简单,只有 2 个我想要的方法。 ServiceResponse你看到的类也很简单,但我认为会导致问题:

[DataContract]
public class ServiceResponse
{
[DataMember]
public ResponseCode Status { get; set; }

[DataMember]
public object Value { get; set; }
}

我做了这个类,所以我总是可以发送一个状态(简单的 int 枚举)和一个对象,例如一个字符串或一个对象列表。

我使用 jQuery 创建了一个小脚本来测试我的服务,Authenticate方法正常工作,但此方法返回 ServiceResponse对象,在 Status 中只有一个 0 field 。 Value此处字段留空。

GetProducts方法是一个棘手的方法,像这样的匿名对象数组:

public ServiceResponse GetProducts()
{
DataClassesDataContext db = new DataClassesDataContext();
var results = from p in db.Products
where p.UserID == 1
select new
{
ID = p.ID,
Name = p.DecryptedName
};

return ServiceResponse.OK(results.ToArray());
}

我在这里使用匿名类型对象,因为我不想为我想在 API 中使用的所有类创建代理类。

当我使用简单的 jQuery 脚本尝试这段代码时,FireBug 告诉我我的请求已中止。我猜这是因为 Error 500 之类的。当我在 GetProducts 中放置断点时方法,在 Firefox 说它被中止并且脚本完全运行之前,它被命中了 7 次。

这是我用来测试我的 WCF 服务的 jQuery 脚本:

$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "/Handlers/API.svc/GetProducts",
data: '{}',
dataType: "json",
success: function (response) {
var test = inspect(response, 5);
$("#output").html(test);
},
error: function (message) {
$("#output").html(inspect(message, 5));
}
});

inspect您在其中看到的方法只是一个小的 JS 脚本,它向我展示了一个对象的内容。

我尝试了以下方法让它动起来:

  • Product 类型的对象替换匿名对象, 但这以同样的方式失败了
  • 返回 List<T>而不是数组,但也没有运气。
  • 返回时未分配给 Value 任何内容属性(property),这行得通
  • 更改属性 Valuedynamic类型,这也失败了

如果我可以使用 WCF 返回某种匿名对象数组,我会很高兴,因为这样可以节省我创建 30 多个代理类的时间。

注意:Product class 是由 LINQ 生成的类。我为此使用 C# 4.0。

最佳答案

我可能是错的,但我相信 WCF 相当严格,不允许您以您尝试的方式返回对象。如果您知道数据每次都将是一个数组,您可以更改您的定义以反射(reflect)这一点(但听起来这对您的情况不起作用)。否则,您可能需要考虑将签名更改为简单的字符串,并在返回之前先将数据序列化为 JSON。

关于c# - WCF 服务返回带有匿名对象的 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8332607/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com