Skip to main content
 首页 » 编程设计

c#之通过 WebApi 返回 JSON

2024年02月04日29JustinYoung

我正在使用 C# 中的 HttpClient 尝试将 SSO(单点登录)集成到我们的一些自定义应用程序中。

我已经在我们的 JavaScript 应用程序中成功地做到了这一点,但我在将它集成到我们的一些 Umbraco 网站时遇到了一些困难。

到目前为止我的代码:

using System; 
using System.Threading.Tasks; 
using System.Net.Http; 
using System.Net.Http.Headers; 
using System.Web; 
using System.Web.Http; 
using Newtonsoft.Json; 
using System.Collections.Generic; 
using Umbraco.Web; 
using Umbraco.Web.WebApi; 
 
namespace Umbraco.WebApi 
{ 
  public class TestController : UmbracoApiController 
  { 
 
    public  HttpClient client = new HttpClient(); 
 
    [HttpPost] 
    public async Task<Object> GetRefreshToken(Token t) 
    { 
      try { 
        string refToken = t.refresh_token; 
 
        var values = new Dictionary<string, string> 
        { 
          { "grant_type", "refresh_token" }, 
          { "client_id", "CLIENTID" }, 
          { "client_secret", "CLIENTSECRET" }, 
          { "refresh_token", refToken } 
        }; 
 
        var content = new FormUrlEncodedContent(values);         
        var response = await client.PostAsync("https://URL.org/Token", content); 
 
        string responseString = await response.Content.ReadAsStringAsync(); 
 
        return responseString; 
 
      } catch(HttpRequestException e) { 
        return e; 
      } 
    } 
 
    public class Token 
    { 
      public string refresh_token { get; set; } 
    } 
 
    public class AuthData 
    { 
      public string access_token { get; set; } 
      public string token_type { get; set; } 
      public int expires_int { get; set; } 
      public string refresh_token { get; set; } 
      public string userName { get; set; } 
      public string client_id { get; set; } 
      public DateTime issued { get; set; } 
      public DateTime expires { get; set; } 
 
    } 
  } 
} 

它确实成功返回了我想要的数据,但返回的数据存在问题(删除了敏感数据):

<z:anyType xmlns:d1p1="http://www.w3.org/2001/XMLSchema" xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/" i:type="d1p1:string"> 
{"access_token":"XXXXXXXX","token_type":"bearer","expires_in":1199,"refresh_token":"XXXXXX","userName":"XXXXXX","as:client_id":"XXXXX",".issued":"Fri, 20 Sep 2019 13:23:48 GMT",".expires":"Fri, 20 Sep 2019 13:43:48 GMT"} 
</z:anyType> 

它似乎也以 XML 而不是 JSON 的形式返回?

C# 不是我最擅长的语言,所以我可能完全错了。

感谢任何帮助。

请您参考如下方法:

在您的代码中,在您获得 JSON 字符串后 responseString ,而不是返回它,尝试下面的代码。

... 
string responseString = await response.Content.ReadAsStringAsync(); 
response = Request.CreateResponse(HttpStatusCode.OK); 
response.Content = new StringContent(responseString, Encoding.UTF8, "application/json"); 
return response; 

您需要将方法返回值从 Task<Object> 更改为至 Task<HttpResponseMessage>

编辑:

要访问属性,请安装 Newtonsoft.Json 包并尝试以下代码。

var jsonString = ... 
JObject jo = JObject.Parse(jsonString); 
Console.WriteLine(jo["access_token"]);