使用来自 .Net 2.0 和 .Net 4.5 的 JSON Web 服务
Consuming a JSON Web Service from .Net 2.0 and .Net 4.5
我已经使用 .Net 4.5 和 RestSharp 创建了一个 Web 服务。该服务最初将有两个客户端使用它:一个也使用 .Net 4.5 和 RestSharp,另一个暂时停留在 .Net 2.0 和 WebClient 上(因为 RestSharp 不支持 .Net 2.0) .
我可以通过以下操作成功响应来自 .Net 4.5 客户端的调用:
[HttpPost]
public IRestResponse<CustomMessageResponseType> Send([FromBody]string message)
{
//action code here;
}
但是,这会导致 message
在被 .Net 2.0 客户端调用时具有 null
值。通过将操作签名更改为(注意消息参数类型的更改),我能够成功响应来自 .Net 2.0 客户端的调用:
[HttpPost]
public IRestResponse<CustomMessageResponseType> Send([FromBody]CustomMessageType message)
{
//action code here;
}
但这会在 .Net 4.5 客户端调用时导致 message
的 null
值。
我也试过将这两个动作都包含在控制器中并依靠签名自动区分它们,但这导致两者都没有被调用。
在 .Net 2.0 客户端中,我是这样调用服务的:
private string Send(CustomMessageType message)
{
var request = new WebClient { BaseAddress = API.ToString(), Encoding = Encoding.UTF8 };
request.Headers[HttpRequestHeader.ContentType] = "application/json";
request.Headers[HttpRequestHeader.Accept] = "application/json";
var content = JsonConvert.SerializeObject(message);
var response = request.UploadString("Message", content);
return response;
}
消息包含如下内容:
{
"Subject":"Test Message",
"Body":"This is a test message.",
"Recipients":
[{
"FirstName":"John",
"LastName":"Doe",
"Name":"John Doe",
"RecipientID":"1",
"ContactPoints":
{
"Email":"John.Doe@example.com",
"Phone":null,
"Text":null
}
}],
"Sender":
{
"FirstName":"Test Account",
"LastName":null,
"Name":"Test Account",
"RecipientID":null,
"ContactPoints":
{
"Email":null,
"Phone":"5555551234",
"Text":null
}
}
}
谁能帮我弄清楚如何为这两个客户提供服务?
问题最终出现在我的原始代码中(不是总是这样吗?)。 .Net 4.5 客户端发送的 JSON 数据实际上被双重转义。我将对象序列化为 JSON,然后将其传递给 RestSharp 的 AddBody
方法,该方法需要一个反序列化的对象,因此它再次对其进行序列化,这相当于转义了所有转义字符。好处是 .Net 2.0 客户端不再需要使用 RestSharp-.NET-2.0-Fork,我可以使用我非常喜欢的强类型操作参数。
再次感谢您在完成此@dbarnes 过程中提供的所有帮助。对于长期 reader 的初次调查官来说,这是一次很棒的初次体验。
我已经使用 .Net 4.5 和 RestSharp 创建了一个 Web 服务。该服务最初将有两个客户端使用它:一个也使用 .Net 4.5 和 RestSharp,另一个暂时停留在 .Net 2.0 和 WebClient 上(因为 RestSharp 不支持 .Net 2.0) .
我可以通过以下操作成功响应来自 .Net 4.5 客户端的调用:
[HttpPost]
public IRestResponse<CustomMessageResponseType> Send([FromBody]string message)
{
//action code here;
}
但是,这会导致 message
在被 .Net 2.0 客户端调用时具有 null
值。通过将操作签名更改为(注意消息参数类型的更改),我能够成功响应来自 .Net 2.0 客户端的调用:
[HttpPost]
public IRestResponse<CustomMessageResponseType> Send([FromBody]CustomMessageType message)
{
//action code here;
}
但这会在 .Net 4.5 客户端调用时导致 message
的 null
值。
我也试过将这两个动作都包含在控制器中并依靠签名自动区分它们,但这导致两者都没有被调用。
在 .Net 2.0 客户端中,我是这样调用服务的:
private string Send(CustomMessageType message)
{
var request = new WebClient { BaseAddress = API.ToString(), Encoding = Encoding.UTF8 };
request.Headers[HttpRequestHeader.ContentType] = "application/json";
request.Headers[HttpRequestHeader.Accept] = "application/json";
var content = JsonConvert.SerializeObject(message);
var response = request.UploadString("Message", content);
return response;
}
消息包含如下内容:
{
"Subject":"Test Message",
"Body":"This is a test message.",
"Recipients":
[{
"FirstName":"John",
"LastName":"Doe",
"Name":"John Doe",
"RecipientID":"1",
"ContactPoints":
{
"Email":"John.Doe@example.com",
"Phone":null,
"Text":null
}
}],
"Sender":
{
"FirstName":"Test Account",
"LastName":null,
"Name":"Test Account",
"RecipientID":null,
"ContactPoints":
{
"Email":null,
"Phone":"5555551234",
"Text":null
}
}
}
谁能帮我弄清楚如何为这两个客户提供服务?
问题最终出现在我的原始代码中(不是总是这样吗?)。 .Net 4.5 客户端发送的 JSON 数据实际上被双重转义。我将对象序列化为 JSON,然后将其传递给 RestSharp 的 AddBody
方法,该方法需要一个反序列化的对象,因此它再次对其进行序列化,这相当于转义了所有转义字符。好处是 .Net 2.0 客户端不再需要使用 RestSharp-.NET-2.0-Fork,我可以使用我非常喜欢的强类型操作参数。
再次感谢您在完成此@dbarnes 过程中提供的所有帮助。对于长期 reader 的初次调查官来说,这是一次很棒的初次体验。