【发布时间】:2015-03-24 16:20:18
【问题描述】:
我使用 .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;
}
但是,当被 .Net 2.0 客户端调用时,这会导致 message 具有 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
}
}
}
谁能帮我弄清楚如何为这两个客户提供服务?
【问题讨论】:
-
您能举例说明您发送的邮件正文吗?还有您如何在 .Net2.0 中提出请求的示例代码
-
我刚刚找到RestSharp-.NET-2.0-Fork,它允许我在 .Net 2.0 客户端中使用 RestSharp,它与字符串类型的签名一起使用,因此差异似乎归结为每个客户端库(WebClient vs . RestSharp)通过网络发送数据,但我仍然无法确定差异。我是否应该将此标记为答案,然后创建一个单独的问题来找出图书馆网络流量之间的差异?
-
不,我认为它仍然是相关的,你有没有使用 fiddler 之类的东西查看到服务器的有效负载?我打赌在一种情况下,他们没有设置正确的 Content-Type(或其他)标头,这可能会导致您的问题。
-
这正是我一直在尝试的。到目前为止,我已经能够在提琴手中捕获 .Net 2.0 客户端的流量,但由于某种原因不能捕获 .Net 4.5 客户端。
-
嗯,当您将服务器指向本地主机而不是实际 IP/名称时,通常会出现这种情况。你能验证是/不是吗?
标签: c# asp.net json asp.net-web-api webclient