繁体   English   中英

API Endpoint C# web API 不支持的媒体类型

[英]Unsupported Media Type for API Endpoint C# web API

我有一个 API 网关,它将 appsettings 文件作为字符串发送,我更新了 UI 中的一些键,然后我想将其提交回网关以替换服务器上的设置。 当我将 JSON 字符串提交回 API 时,我收到错误 415 Unsupported media type。

这是终点

        [HttpPost("{app}/set")] // POST /api/settings/{app}/set
        public bool Set(string app, [FromBody] string content)
        {
            _logger.LogInformation($"recieved request on settings/{app}/set, id: {_requestId}");
            var response = false;
            try
            {
                System.IO.File.WriteAllText(GetAppSettingsPath(app), content, Encoding.UTF8);
                _logger.LogInformation($"Completed request for requestId: {_requestId}");
                response = true;
            }
            catch (Exception ex)
            {
                _logger.LogError(ex, $"Error on requestId, {_requestId}");
            }
            return response;
        }

这是我的客户服务

public ApiService(ILogger<ApiService> logger, IOptions<AppSettings> appsettings, HttpClient client)
{
    _logger = logger;
    _baseUri = new Uri(appsettings.Value.GatewayBaseURL);
    client.DefaultRequestHeaders.Accept.Clear();
    client.Timeout = Timeout.InfiniteTimeSpan;
    _client = client;
}
            
public async Task<bool> SetAppSettings(string app, string content)
{
    var response = false; //always fails by default
    try
    {
        var httpRequest = new HttpRequestMessage { Method = HttpMethod.Post, RequestUri = new Uri(_baseUri, string.Concat("api/settings/", app, "/set")), Content = new StringContent(content, Encoding.UTF8) };
        httpRequest.Headers.Add("content-type", "text/plain");
        var httpResponse = await _client.SendAsync(httpRequest).ConfigureAwait(false);
        httpResponse.EnsureSuccessStatusCode();
        var responseBody = await httpResponse.Content.ReadAsStringAsync().ConfigureAwait(false);
        response = bool.TryParse(responseBody, out var parseValue) ? parseValue : false; 
    }
    catch (Exception ex)
    {
        _logger.LogError(ex, $"Failed to set the settings for application, {app}");
    }
    return response;
}

我已经阅读了一些试图解决此问题的堆栈答案,但我不确定是否需要更改端点、客户端、requestMessage 或所有这些。 我也很感激有关使用哪个标头以及如何正确声明它的一些指导。 其中大多数都说要应用“application/json”,但我不确定这是否适合我的情况。 1 2 3 4

更新我已将我的客户端更改为使用 WebClient 代替流动代码。 现在我收到了 400 个错误的请求,而不是 415 个不支持的媒体类型错误。

    WebClient client = new WebClient();
    client.Headers[HttpRequestHeader.ContentType] = "application/json";
    var url = new Uri(_baseUri, string.Concat("api/settings/", app, "/set"));
    var responseString = client.UploadString(url, "POST", content);
    response = bool.TryParse(responseString, out var result) && result;

我想到了。 我想用于“text/plain”的媒体类型需要不同的处理,端点签名中的参数导致了问题。 这篇文章有帮助。

更新的端点:

[HttpPost("{app}/set")] // POST /api/settings/{app}/set
public bool Set(string app)
{
    string jsonString = null;
    using (StreamReader reader = new StreamReader(Request.Body, Encoding.UTF8))
    {
        jsonString = reader.ReadToEndAsync().Result;
    }
    System.IO.File.WriteAllText(GetAppSettingsPath(app), jsonString, Encoding.UTF8);
}

更新的客户端:

    WebClient client = new WebClient();
    client.Headers[HttpRequestHeader.ContentType] = "text/plain";
    var url = new Uri(_baseUri, string.Concat("api/settings/", app, "/set"));
    var responseString = client.UploadString(url, "POST", content);
    response = bool.TryParse(responseString, out var result) && result;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM