使用URI和Da​​taContract类参数编写Web服务方法

如何获取Web服务方法来访问URI和复杂POST数据中的参数?

我有一个Web服务方法,在URI中有一些参数:

"/api/{something}/{id}" 

我还有一个标有DataContract / Member属性的类,我希望webservice方法接受它。 请注意,我的类包含一个也标有DataContract / Member属性的子类。

 [DataContract] public class MoreData{ [DataMember] public string SomeString { get; set; } [DataMember] public SubClass SubData {get; set;} } 

我的方法声明如下:

 [OperationContract] [WebInvoke( Method = "POST", UriTemplate = "/api/{something}/{id}")] public MyWebSvcRetObj Update(string something, string id) 

如何让我的Update方法也接受MoreData类? 我已经能够编写如下方法:

 [OperationContract] [WebInvoke( Method = "POST")] public MyWebSvcRetObj Update(MoreData IncomingData) 

但只有当URI没有指定任何参数时,URI才会显示

 "api/Update" 

最终,我希望我的用户能够:

 $.ajax({ url: 'localhost/site/api/things/12345 type: 'POST' data: { SomeString: 'I am a string' SubData: { //...more data } } }); 

我已经尝试将Stream作为Update方法中的最后一个参数,但这似乎不适用于具有子类的类,如我给出的示例。 它最终具有键/值对,如“SubData [SomeSubDataProp]”:“Val”。 这对我来说似乎不对。 我也尝试在Update方法中添加一个MoreData参数作为最后一个参数,但是我得到一个错误,表明它期待一个流(因为它期望原始数据)。 我正在尝试做什么? 或许我会以错误的方式解决这个问题?

UPDATE

正如Faizan Mubasher所写,如果我的网络方法如下所示,我的用户将能够发送post数据:

 [OperationContract] [WebInvoke( Method = "POST", UriTemplate = "/v1/{something}/{id}", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare )] [Description( "Update " )] public void Update( MoreData Incoming, string something, string id ) 

客户看起来像:

 $.ajax({ type: 'POST', url: 'http://localhost/app/api/something/12345', contentType: 'application/json', //need to specify type data: JSON.stringify({ //note the "stringify" call SomeString: 'hello, world', SubClass: { SubStr: 'hello, again', SubInt: 98765 } } }); 

您希望为GETPOST保留相同的URI

  1. 当使用参数/ api / {something} / {id}调用GET方法时,则基于id ,它将向客户端返回他/她可以编辑的数据。

  2. 编辑完成后,使用POST方法将编辑后的数据发送回服务器,其中URIIDGET请求中提到的相同。

如果是这样,那么这是解决方案:

为此,请使用相同的UriTemplate创建两个具有不同名称的方法。

 [ServiceContract] public interface IMyWebSvc { [OperationContract] [WebGet(UriTemplate = "/api/{something}/{id}", ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] MyWebSvcRetObj GetData(string something, string id); [OperationContract] [WebInvoke(Method = "POST", UriTemplate = "/api/{something}/{id}", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Bare)] string Update(MoreData IncomingData, string something, string id); } 

现在,应该是JSON的格式。 这很容易。 在您的MoreData类中, 重写 ToString()方法。

 public override string ToString() { JavaScriptSerializer js = new JavaScriptSerializer(); return js.Serialize(this); } 

JavaScriptSerializerSystem.Web.Script.Serialization中可用。 现在,要检查您的服务将接受哪种JSON格式,请对您的Web服务方法进行虚拟调用,并在object.ToString()方法上找到一个断点。

 MoreData md = new MoreData(); string jsonString = md.ToString(); // hit break point here. 

当您点击断点时,在jsonString变量中,您将拥有您的服务将接受的json。 因此,建议您的客户端以该格式发送JSON。

因此,您可以在MoreData类中指定复杂类型。

我希望这能帮到您! 谢谢

您似乎将JSON数据发布到强类型的Web服务方法。

这与此主题有些相似: 如何将强类型模型作为数据参数传递给jquery ajaxpost?

一种解决方案是接受Json对象(您提到的键值对)并反序列化为您的MoreData类型。