首页 新闻 会员 周边

C#HttpWebRequest Post请求腾讯云信鸽Push API V3 远程服务器返回错误: (403) 已禁止。

0
悬赏园豆:200 [已解决问题] 解决于 2020-10-08 14:43

Stream requestStream = null;
HttpWebRequest httpRequest = null;
try
{

            WebRequest webRequest = WebRequest.Create(url);
            httpRequest = webRequest as HttpWebRequest;
            if (httpRequest == null)
            {
                httpRequest.Abort();
                throw new ApplicationException(string.Format("无效的URL地址: {0}", url));
            }
            httpRequest.ContentType = "application/json";  //编码方式
            httpRequest.Method = "POST";  //提交方式
            httpRequest.ContentLength = data.Length;
            httpRequest.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
            httpRequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2; zh-CN; rv:1.9.2.8) Gecko/20100722 Firefox/3.6.8";
            

            httpRequest.Headers.Add("Authorization", "Basic " + contentType);
            httpRequest.CookieContainer = new CookieContainer();


            //httpRequest.ContentType = "application/json";
            requestStream = httpRequest.GetRequestStream();
            await requestStream.WriteAsync(data, 0, data.Length);

        }
        catch (Exception exx)
        {
            throw new Exception(string.Format("POST异常:{0}", exx.Message));

        }
        finally
        {
            if (requestStream != null) requestStream.Dispose();
        }

        Stream responseStream = null;
        HttpWebResponse res;
        byte[] b = null;
        MemoryStream ms = null;
        try
        {
            res = (HttpWebResponse)await httpRequest.GetResponseAsync();
            responseStream = res.GetResponseStream();

            ms = new MemoryStream();

            int count = 0;
            byte[] buff = new byte[1024];
            do
            {
                count = await responseStream.ReadAsync(buff, 0, buff.Length);
                ms.Write(buff, 0, count);

            } while (count > 0);
            b = ms.ToArray();
        }
        catch (WebException exp)
        {
            throw new Exception(string.Format("POST操作发生异常:{0}", exp.Message));
        }
        finally
        {
            if (ms != null) ms.Dispose();
            if (responseStream != null) responseStream.Dispose();
        }
        return b;

在Postman上可以访问,抓包查看header是没有一些参数,例如application/json抓包的时候header里就没有

飞腾的翔的主页 飞腾的翔 | 初学一级 | 园豆:22
提问于:2020-10-08 10:52
< >
分享
最佳答案
1

403是權限問題
先確認你的授權資訊是否正確

收获园豆:200
RosonJ | 老鸟四级 |园豆:4910 | 2020-10-08 10:58

谢谢您的回答,我想问一下像这里的授权资讯是什么

飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 11:00

url以及权限验证我都是正确的

飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 11:00

在Postman上可以访问,抓包查看header是没有一些参数,例如application/json抓包的时候就看不到

飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 11:06

@陈俐安:
使用這個API應該需要Token或Key之類的
這些資訊是否有正確帶給API?

RosonJ | 园豆:4910 (老鸟四级) | 2020-10-08 11:11

@RosonJ: 我想问的就是这里,API需要base64给参数带过去,我contentType这个就是base64的参数,然后我抓包看header里面是没有这个参数的

飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 11:13

@陈俐安:
是整個header不存在?還是值空了

RosonJ | 园豆:4910 (老鸟四级) | 2020-10-08 11:22

@RosonJ: 是header里该有的鉴权的键值对没有,但是我debug看又是有的,抓包看header就没有;
像ContentType:application/json这个键值对也是没有

飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 11:23

@陈俐安:
加這個試試

httpRequest.PreAuthenticate = true;
RosonJ | 园豆:4910 (老鸟四级) | 2020-10-08 11:33

@RosonJ: 不行啊,还是403。。

飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 11:35

@陈俐安:
用你的代碼實測有送出Authorization header
你用什麼工具抓包?

RosonJ | 园豆:4910 (老鸟四级) | 2020-10-08 13:43

@RosonJ: charles 啊,那我怎么一直都是403呢。。。

飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 13:59

@陈俐安:
Wireshark抓包結果如圖
Wireshark抓包結果

是否是你的Authorization 值不對呢?

RosonJ | 园豆:4910 (老鸟四级) | 2020-10-08 14:08

@RosonJ: 值可能是不对的,但是我用同样的值postman可以收到返回参数,但这里就一直返回403

飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 14:12

@陈俐安:
能否提供data, url及假的Authorization,我試試

RosonJ | 园豆:4910 (老鸟四级) | 2020-10-08 14:14

@RosonJ: postman返回的参数是:{
"ret_code": 1008003,
"err_msg": "auth failure"
},能返回这个就成功了

飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 14:32

@陈俐安:
搞清楚了,其實兩種請求方式的結果是一樣的
Postman 收到403 後還是會顯示json結果
httpRequest.GetResponse 接收到403 就跳到錯誤處理,其實也有接到json 結果,只是沒處理而已
用wireshark抓包的結果一模一樣

RosonJ | 园豆:4910 (老鸟四级) | 2020-10-08 14:41

@RosonJ: 嗷嗷,好的谢谢解答,非常感谢。

飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 14:42

@RosonJ: 那我需要如何处理才能收到这个json呢

飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 14:48

@飞腾的翔:
這樣

catch(WebException ex)
{
     var response = (HttpWebResponse)ex.Response;
}
RosonJ | 园豆:4910 (老鸟四级) | 2020-10-08 16:35

@RosonJ: 好的非常感谢!

飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 16:35
其他回答(2)
0

建议检查一下下面这行代码是否有问题

httpRequest.Headers.Add("Authorization", "Basic " + contentType);
dudu | 园豆:30994 (高人七级) | 2020-10-08 11:12

谢谢您的回复,我抓包看了header,是没有这个键值对的,所以不知道该怎么在header里添加键值对

支持(0) 反对(0) 飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 11:14

因为这个API鉴权需要在header里添加键值对,所以这个参数这样添加,但是我抓包的时候看到是没有这个键值对的

支持(0) 反对(0) 飞腾的翔 | 园豆:22 (初学一级) | 2020-10-08 11:19

@陈俐安: 代码有些乱,建议简化一下,比如 ASP.NET/C# WebRequest POST Google OAuth API

支持(0) 反对(0) dudu | 园豆:30994 (高人七级) | 2020-10-08 12:43
0

Postman 可以查看调用的很多语言系的代码,可以和你的进行对比,看一下有什么不同,就知道问题

Code的那些事 | 园豆:202 (菜鸟二级) | 2020-10-09 10:06
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册