首页 > 解决方案 > 将 JSON 发送到 C# 中的 GET 方法

问题描述

我有一个带有如下控制器的 Web 服务:

    [HttpGet]
    [Customizing.RequestSizeLimit(1048576)] // 1 MB
    [ProducesResponseType(StatusCodes.Status200OK)]
    [ProducesResponseType(StatusCodes.Status422UnprocessableEntity)]
    public async Task<IActionResult> ValidateTicketAsync([FromBody]KerberosTicketDto ticket)
    {//code in here//}

Swagger 声明 Web 服务接受:

{
"ticket": "string"
}

从客户端,我得到一个 Kerberos 票并将其转换为字符串:

KerberosSecurityTokenProvider tokenProvider = new KerberosSecurityTokenProvider(ServiceServer, TokenImpersonationLevel.Identification);
KerberosRequestorSecurityToken token = tokenProvider.GetToken(TimeSpan.FromMinutes(1)) as KerberosRequestorSecurityToken;
...
tokenString = Convert.ToBase64String(token.GetRequest());

然后尝试将数据发送到 Web 服务器,并返回响应代码(即希望为 200):

WebClient webClient = new WebClient();
webClient.QueryString.Add("ticket", tokenString);
//webClient.QueryString.Add("spn", ServiceServer);
string result = webClient.DownloadString(urlTest);

然后调试窗口向我发送以下信息:

[10:40:21 DBG] Attempting to bind parameter 'ticket' of type 'Kerberos.TicketValidator.WebApi.Model.KerberosTicketDto' using the name 'ticket' in request data ...
[10:40:21 DBG] Rejected input formatter 'Microsoft.AspNetCore.Mvc.Formatters.JsonPatchInputFormatter' for content type 'null'.
[10:40:21 DBG] Rejected input formatter 'Microsoft.AspNetCore.Mvc.Formatters.JsonInputFormatter' for content type 'null'

Web 服务获取的参数似乎不是它预期的类型。

谁能帮我把它转换成正确的类型?或者如何首先将其作为正确的类型发送?

谢谢!

标签: c#web-servicesasp.net-corehttp-headerswebclient

解决方案


我认为您需要将票作为对象发送,该对象具有称为ticketnot as string 的属性。

有了HttpClient它可能会像下面这样。

var tokenJson = jsonSerializer.Serialise(new {token = tokenString });
using(var client = new HttpClient())
{
  var req = new HttpRequestMessage
  {
      Method = HttpMethod.Get,
      RequestUri = new Uri("some url"),
      Content = new StringContent(tokenJson, Encoding.UTF8, ContentType.Json),
  };

   var res = await client.SendAsync(req).ConfigureAwait(false);
   res.EnsureSuccessStatusCode();

   var res = await response.Content.ReadAsStringAsync().ConfigureAwait(false);
}

推荐阅读