C# 为什么在尝试发布到Slack API时出现“无效表单数据”错误?

C# 为什么在尝试发布到Slack API时出现“无效表单数据”错误?,c#,json,slack-api,C#,Json,Slack Api,当我使用此方法时: public async Task<HttpResponseMessage> UploadFileAsync(MultipartFormDataContent requestContent) { HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, UriMethod); request.Content = requestContent; var respo

当我使用此方法时:

public async Task<HttpResponseMessage> UploadFileAsync(MultipartFormDataContent requestContent)
{
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, UriMethod);
    request.Content = requestContent;
    var response = await _httpClient.SendAsync(request);

    return response;
}
public async Task<HttpResponseMessage> SendMessageAsync(FormUrlEncodedContent content)
{
    var response = await _httpClient.PostAsync(UriMethod, content);

    return response;
}
因此,我尝试显式地告诉它“mediaType”,我尝试了application/json和其他,但所有这些都会导致相同的错误。下面是调用upper方法的完整Main方法:

    namespace TestArea
    {
        class MainArea
        {
            public static void Main( string[] args)
            {
                try
                {
                    Task.WaitAll(SendMessage());
                }
                catch(Exception ex)
                {
                    Console.WriteLine(ex);
                    Console.ReadKey();
                }
            }

 private static async Task SendMessage()
    {
        var client = new BpsHttpClient("https://slack.com/api/chat.postMessage");
        JsonObject JO = new JsonObject();
        JO.channel = "DCW21NBHD";
        JO.text = "This is so much fun :D !";
        var Json = JsonConvert.SerializeObject(JO, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });

        var StringJson = new StringContent(Json, Encoding.UTF8, "application/json");

        var requestContent = new MultipartFormDataContent();
        requestContent.Add(StringJson);

        var Response = await client.UploadFileAsync(requestContent);

        string AnswerContent = await Response.Content.ReadAsStringAsync();

    }
当我使用此方法时:

public async Task<HttpResponseMessage> UploadFileAsync(MultipartFormDataContent requestContent)
{
    HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, UriMethod);
    request.Content = requestContent;
    var response = await _httpClient.SendAsync(request);

    return response;
}
public async Task<HttpResponseMessage> SendMessageAsync(FormUrlEncodedContent content)
{
    var response = await _httpClient.PostAsync(UriMethod, content);

    return response;
}
因此,基本上我在这里传递的是FormUrlEncodedContent,而不是MultipartFormDataContent,然后我得到了我想要的响应,并且可以使用它。但这对我来说用处不大,因为我必须使用MultipartFormDataContent才能随请求发送文件


有人知道这里失败的是什么吗?为什么它不喜欢一种内容类型而喜欢另一种?我非常感谢你的建议和想法

由于API方法chat.postMessage不支持包含多部分/表单数据的请求,因此会出现无效表单数据的错误

从未被接受的内容类型中可以看出,此方法只接受:application/x-www-form-urlencoded、application/json

请注意,您不能将文件上载到chat.postMessage

如果要上载文件,请使用API方法,该方法还支持多部分/表单数据


另请参阅我的答案,了解如何上传带有注释的文件。

尚未使用slack api,但我想知道您是否不应将创建的请求设置为多部分,也不应取消UploadFileAsync函数将JsonConvert与JsonObject一起使用有何意义?你知道什么是调试吗?你至少记录过var Json吗?@Francopetigrosso-这里没有任何脏话@塞尔文-非常有帮助,谢谢你@老实说,我不能说,我已经在这段代码的旧版本中使用了这个方法。但是在旧版本中,我没有使用Newtonsoft的NuGet包序列化为Json,而是使用Dictionary来序列化我的对象。。。还有其他想法吗?我的意思是,这显然与我的JSONObject有关…@Fabianhold在你的main类区域的main方法中,你有“ass”嘿Erik,我知道我可以使用哪些方法来做什么。你们所有人都应该知道:我没有试图上传任何东西,我只是想发布一条消息。我只需要能够使用其他方法。并且能够上传文件。但现在我只想发布一条消息——你知道,从最简单的方法开始。正如我所写的,我尝试了所有三种内容类型——所有三种!!!这就是让我如此生气的原因。。。这没什么区别。我总是会遇到同样的错误。有趣的是,当我没有将序列化的JsonObject放入“MultipartFormData”中,而是直接发送JsonObject时——这也应该有效,因为我只需要“Multipart”就可以在以后添加一个文件——我得到了未授权的错误。所以,这告诉我我的JsonObject不知怎的是失败的。但是,当我反序列化我的JsonObject时,它看起来非常好……它看起来是这样的:{as_user:true,token:xoxp MyToken,channel:DCW21NBHD,text:this是如此有趣:D!}当我创建一个dictionary并创建一个带有这些参数的FormUrlEncodedContent对象时,它可以完美地工作。但是我只想使用我的JsonObject类,因为它应该可以工作,而且它会使事情变得更简单,因为我不必编写每种可能的消息/请求的代码。因此,如果有人知道我的JsonObject出了什么问题,我将非常感激我刚刚意识到你为什么写我不应该在聊天中使用MultipartFormData.postMessage:D我是个白痴。是的,我在这个方法上使用了Multipart。。。很抱歉好吧,那么真正的问题在于,我的JsonObject不知何故没有正确地呈现令牌,就像我在上面写的那样。当我尝试时,我得到了未授权错误。