我为WCF API获得了以下接口:
[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",RequestFormat = Webmessageformat.Json)] ServiceResponse GetProducts(); }
这一切都非常简单,只有两种我想要的方法.你看到的ServiceResponse类也很简单,但是我想到的问题是:
[DataContract] public class ServiceResponse { [DataMember] public ResponseCode Status { get; set; } [DataMember] public object Value { get; set; } }
我创建了这个类,所以我总是可以发送一个Status(Simple int enum)和一个对象,例如一个字符串或一个对象列表.
我使用jQuery创建了一个小脚本来测试我的服务,而Authenticate方法就像它应该的那样工作,但是这个方法返回一个ServiceResponse对象,在Status字段中只有一个0. “值”字段在此处保留为空.
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告诉我我的请求已被中止.我想这是因为错误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类型的对象替换匿名对象,但这以相同的方式失败
>返回列表< T>而不是阵列,但也没有运气.
>没有任何分配给Value属性的返回,这是有效的
>将属性值更改为动态类型,此操作也失败
如果我可以使用WCF返回某种匿名对象数组,我会喜欢它,因为这可以节省我创建30个代理类.
注意:Product类是LINQ生成的类.我正在使用C#4.0.
解决方法
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。