我能够让它工作 - 这就是我所做的。首先,我的环境是 VS2010,我使用的是 VS Web 服务器(Cassini)。
我没有更改您的方法签名或WebInvoke 属性。 GetAll() 方法的主体是这样的:
[OperationContract]
[WebInvoke(Method = "GET", ResponseFormat = WebMessageFormat.Json,
BodyStyle = WebMessageBodyStyle.Bare, UriTemplate = "product/getall")]
Product[] GetAll()
{
Product[] prods = new Product[3] {
new Product() { Name="Foo", Desc="Bar"},
new Product() {Name="Ha", Desc="Ho"},
new Product() {Name="Who", Desc="What"}
};
return prods;
}
web.config 如下所示:
<system.serviceModel>
<behaviors>
<endpointBehaviors>
<behavior name="WebApplication2.ProdServiceAspNetAjaxBehavior">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true"
multipleSiteBindingsEnabled="true" />
<services>
<service name="WebApplication2.ProdService">
<endpoint address="" behaviorConfiguration="WebApplication2.ProdServiceAspNetAjaxBehavior"
binding="webHttpBinding" contract="WebApplication2.ProdService" />
</service>
</services>
</system.serviceModel>
老实说,其中大部分是默认的开箱即用功能。我唯一更改的是将endpointBehavior 更改为使用webHttp 而不是默认的enableWebScript。除此之外,它运行良好。
编辑(忘记了 Product 类):这是 Product 类 - 我用 DataContract 和 DataMember 属性装饰它:
[DataContract]
public class Product
{
[DataMember()]
public String Name { get; set; }
[DataMember()]
public String Desc { get; set; }
}
这是我的输出:
[{"Desc":"Bar","Name":"Foo"},{"Desc":"Ho","Name":"Ha"},{"Desc":"What","Name":"Who"}]
我的猜测是您在 web.config 中使用了enableWebScript。将其更改为webHttp,看看会发生什么。 enableWebScript 设置用于更多 ASMX 类型的兼容性(我相信)。如果您要返回 JSON(我的许多 GET 服务方法都会这样做),请使用 webHttp(这是我习惯使用的)。
让我知道你得到了什么,我会相应地更新我的答案。