【问题标题】:Consuming a JSON Web Service from .Net 2.0 and .Net 4.5从 .Net 2.0 和 .Net 4.5 使用 JSON Web 服务
【发布时间】: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 客户端调用时导致 messagenull 值。

我也尝试过将这两个动作都包含在控制器中并依靠签名自动区分它们,但这导致两者都没有被调用。

在 .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


【解决方案1】:

问题最终出现在我的原始代码中(不是总是这样吗?)。 .Net 4.5 客户端发送的 JSON 数据实际上是双重转义的。我将对象序列化为 JSON,然后将其传递给 RestSharp 的 AddBody 方法,该方法需要一个反序列化的对象,因此它再次对其进行序列化,这相当于转义了所有转义字符。好处是 .Net 2.0 客户端不再需要使用 RestSharp-.NET-2.0-Fork,我可以使用我非常喜欢的强类型操作参数。

再次感谢您在完成此@dbarnes 过程中提供的所有帮助。它为长期阅读者和第一次调查员提供了很好的第一次体验。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 2010-10-16
    相关资源
    最近更新 更多