gpt4 book ai didi

c# - 使用 URI 和 DataContract 类参数编写一个 webservice 方法

转载 作者:行者123 更新时间:2023-12-02 04:36:16 25 4
gpt4 key购买 nike

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

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

"/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 参数作为最终参数,但我收到一条错误消息,提示它需要一个流(因为它需要原始数据)。我正在尝试做的事情可能吗?或者我可能以错误的方式解决这个问题?

更新

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

[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 方法将编辑后的数据发送回服务器,并使用相同的 URIId 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);
}

JavaScriptSerializerSystem.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 类参数编写一个 webservice 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21912454/

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