gpt4 book ai didi

c# - 编写带有 URI 和 DataContract 类参数的 Web 服务方法

转载 作者:行者123 更新时间:2023-12-02 21:33:14 25 4
gpt4 key购买 nike

如何获取 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”这样的键/值对。这对我来说似乎是错误的。我还尝试添加 MoreData 参数作为 Update 方法中的最终参数,但收到一条错误,指出它需要一个流(因为它需要原始数据)。我想做的事情可能吗?或者也许我的处理方式是错误的?

更新

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

[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. 当使用参数调用GET方法时/api/{something}/{id},然后基于id,它将返回数据给客户端,他/她可以编辑。

  2. 编辑完成后,使用具有相同 URIIdPOST 方法将编辑后的数据发送回服务器,如中所述GET请求。

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

为此,请创建两个具有相同 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);
}

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

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

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

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

希望这对您有帮助!谢谢

关于c# - 编写带有 URI 和 DataContract 类参数的 Web 服务方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21912454/

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