.NET Framework 4.7控制台发起PATCH API返回403 Postman可正常调用排查
问题原因与修复方案
核心问题1:Basic认证头未主动发送
HttpWebRequest的Credentials属性默认遵循“先收到401挑战响应,再发送认证信息”的逻辑,但Oracle SCIM接口不会返回401挑战,无认证头的请求会直接返回403。Postman会主动在首次请求携带Basic认证头,所以可以正常请求。
核心问题2:Content-Type配置错误
你当前用的application/vnd.oracle.adf.action+json是Oracle ADF接口调用自定义操作的媒体类型,SCIM协议的PATCH资源请求标准媒体类型为application/scim+json,与你Postman里配置的Content-Type不一致导致请求被拦截。
次要问题:JSON字符串语法错误
你代码里定义JSON的最后多了一个多余的右括号),会直接导致编译报错。
修复后的代码示例
using System; using System.Net; using System.IO; using System.Text; namespace ConsoleApp1 { class Program { static void Main(string[] args) { var result = string.Empty; // 移除多余的右括号 string json = @"{ ""schemas"": [ ""urn:scim:schemas:core:2.0:User"", ""urn:scim:schemas:extension:fa:2.0:faUser"" ], ""userName"": ""ZMatt.Dandon @cmpy.com"", ""name"": { ""familyName"": ""Dandon"", ""givenName"": ""ZMatt"" }, ""displayName"": ""ZMatt Dandon"", ""preferredLanguage"": ""en"", ""active"": false }"; string url = @"https://url/hcmRestApi/scim/Users/C8FF94E381891376E050480A69294891"; ServicePointManager.Expect100Continue = true; ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; HttpWebRequest Req = (HttpWebRequest)WebRequest.Create(url); // 手动构造Basic认证头,替代Credentials配置 string authInfo = "UserName" + ":" + "Password"; authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)); Req.Headers["Authorization"] = "Basic " + authInfo; // 修正为SCIM PATCH要求的Content-Type Req.ContentType = "application/scim+json"; Req.Method = "PATCH"; using (var streamWriter = new StreamWriter(Req.GetRequestStream())) { streamWriter.Write(json); } var httpResponse = (HttpWebResponse)Req.GetResponse(); using (var streamReader = new StreamReader(httpResponse.GetResponseStream())) { result = streamReader.ReadToEnd(); } } } }
内容的提问来源于stack exchange,提问作者user1529514
相关产品推荐
相关产品推荐

