C# 如何使用POST方法和标题重定向

C# 如何使用POST方法和标题重定向,c#,asp.net,redirect,post,header,C#,Asp.net,Redirect,Post,Header,我需要使用c#重定向到一个API,但我需要使用POST方法并向它添加一些头。 我知道重定向函数使用GET方法,您可以通过html表单使用POST方法,但对于html表单,我不能添加标题。那么ajax调用是实现这一点的唯一方法吗?如果是这样的话,你能给我一个如何在codebehind c#上实现这一点的示例代码吗 我尝试过类似的方法,但是我不断得到一个错误,输入字符串的格式不适合ajax调用字符串 if (Request["code"] != null) {

我需要使用c#重定向到一个API,但我需要使用POST方法并向它添加一些头。 我知道重定向函数使用GET方法,您可以通过html表单使用POST方法,但对于html表单,我不能添加标题。那么ajax调用是实现这一点的唯一方法吗?如果是这样的话,你能给我一个如何在codebehind c#上实现这一点的示例代码吗

我尝试过类似的方法,但是我不断得到一个错误,输入字符串的格式不适合ajax调用字符串

if (Request["code"] != null)
        {
            string AuthCode = Request["code"];
            var byteArray = Encoding.ASCII.GetBytes($"{clientID}:{clientSecret}");
            var clientAuthHeader = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
            ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
            HttpResponse response = HttpContext.Current.Response;
            response.Clear();

            string url = "https://sandbox-oauth.hellenicbank.com/token/exchange?grant_type=authorization_code&redirect_uri=" + redirectUri + "&code=" + AuthCode;
            string ajaxCall = "$.ajax({type: 'POST', url: '" + url + "', " +
            "contentType: 'application/json; charset=utf-8', " +
            "data: '', " +
            "dataType: 'json', " +
            "beforeSend: function(xhr) {xhr.setRequestHeader('Authorization', '" + clientAuthHeader.ToString() + "');}, " +
            "});";

            StringBuilder s = new StringBuilder();
            s.Append("<html>");
            s.Append("<head>");
            s.AppendFormat("<script src='https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js'></script>");
            s.Append("</head>");
            s.Append("<body>");
            s.Append("<script>");
            s.AppendFormat(ajaxCall);
            s.Append("</script></form></body></html>");
            response.Write(s.ToString());
            response.End();
            return;
        }
我试着用我在代码中使用的相同url从调用API,效果很好。因此,我猜问题一定出在我使用的身份验证头上。在API描述中要求 [标题]授权:基本Base64Encode(您的\u客户端\u ID:您的\u客户端\u机密)。 我是否以正确的方式添加此标题

编辑:解决了。我这样做了身份验证:

client.Authenticator = new HttpBasicAuthenticator(clientID, clientSecret);

成功了。我终于拿到了通行证。非常感谢您的帮助。

使用RestSharp工作

最终代码:

if (Request["code"] != null)
        {
            string AuthCode = Request["code"];

            string url = "https://sandbox-oauth.hellenicbank.com/token/exchange?grant_type=authorization_code&redirect_uri=" + redirectUri + "&code=" + AuthCode;
            var client = new RestClient(url);
            var request = new RestRequest();

            request.Method = Method.POST;
            client.Authenticator = new HttpBasicAuthenticator(clientID, clientSecret);
            request.Parameters.Clear();

            request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };

            var queryResult = client.Execute(request);
            return;
        }

使用POST方法的唯一方法是通过html表单
谁告诉你的?不清楚。你是说你需要使用C#生成一些JavaScript,然后通过AJAX调用这个API?还是说C本身需要调用API?因为C#(和大多数其他编程语言)可以发出HTTP请求,所以没有问题。我忍不住觉得你没有完全理解你要做的事情。我怀疑你应该从你的C#那里提出这个请求,因为在你的网页的Javascript中公开授权代码可能是一个非常糟糕的主意(因为任何用户都可以去读Javascript源代码,但不能读C#代码)。不过,也许API提供程序有一些示例可供您参考。我知道您可以使用c#进行POST REUQEST,但我需要在发布数据时使用重定向。我找不到一种方法通过添加标题来使用c#redirect with post方法。你说的“我需要使用redirect”到底是什么意思。请准确描述在POST请求完成后您希望发生的事情。细节很重要。
client.Authenticator = new HttpBasicAuthenticator(clientID, clientSecret);
if (Request["code"] != null)
        {
            string AuthCode = Request["code"];

            string url = "https://sandbox-oauth.hellenicbank.com/token/exchange?grant_type=authorization_code&redirect_uri=" + redirectUri + "&code=" + AuthCode;
            var client = new RestClient(url);
            var request = new RestRequest();

            request.Method = Method.POST;
            client.Authenticator = new HttpBasicAuthenticator(clientID, clientSecret);
            request.Parameters.Clear();

            request.OnBeforeDeserialization = resp => { resp.ContentType = "application/json"; };

            var queryResult = client.Execute(request);
            return;
        }