.NET Framework下ASP.NET调用SAP Business Layer API会话超时问题求助
问题排查与修复方案
核心问题分析
你的代码存在几个关键错误,导致会话无法正确传递——SAP Business Layer完全支持ASP.NET,问题出在代码实现上:
- 重复执行登录请求,生成了新的会话,后续用的是这个新会话的ID,但Cookie却取的是第一次请求的ROUTEID,两者不匹配
- 手动解析会话ID的方式极不稳定,容易因响应格式变化失效
- 没有复用Cookie容器,手动拼接Cookie头可能遗漏SAP要求的Cookie属性(比如SameSite、Domain等)
修复后的代码
' 初始化带Cookie容器的RestClient,确保会话保持 Dim clientOptions = New RestClientOptions("https://10.0.3.15:50000/b1s/v1/") With { .CookieContainer = New System.Net.CookieContainer() } Dim client As New RestSharp.RestClient(clientOptions) ' 登录请求 Dim loginRequest = New RestSharp.RestRequest("Login", RestSharp.Method.POST) loginRequest.AddHeader("Content-Type", "application/json") ' 直接用对象序列化,避免手动拼接JSON出错 Dim loginBody = New With { .CompanyDB = "SBO_ROCHESTER_GOLIVE", .Password = "ABC123", .UserName = "manager" } loginRequest.AddJsonBody(loginBody) Dim loginResponse As RestResponse = client.Execute(loginRequest) Writelog(loginResponse.Content) ' 正确解析SessionId,直接从响应JSON中获取 If loginResponse.IsSuccessStatusCode Then Dim loginResult = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(loginResponse.Content) Dim sessionId = loginResult("SessionId") Writelog($"获取到SessionId: {sessionId}") ' 请求BusinessPartners,复用同一个client,自动传递Cookie Dim bpRequest = New RestSharp.RestRequest("BusinessPartners", RestSharp.Method.GET) Dim bpResponse = client.Execute(bpRequest) Writelog(bpResponse.Content) Else Writelog($"登录失败: {loginResponse.Content}") End If
关键修复点
- 使用CookieContainer让RestSharp自动管理会话Cookie,无需手动拼接Cookie头,避免属性遗漏
- 移除重复的登录请求,确保会话ID和Cookie来自同一次登录
- 使用字典解析响应的SessionId,替代脆弱的Split操作
- 复用同一个RestClient实例,确保会话上下文一致
额外注意事项
- 检查ASP.NET应用的信任级别,确保允许跨域Cookie传递(如果SAP服务器和Web应用不在同一域)
- 确认RestSharp版本为最新稳定版,旧版本可能存在Cookie处理bug
- 可以启用RestSharp的日志功能,查看实际发送的请求头,对比Postman的请求差异
内容的提问来源于stack exchange,提问作者aravindb
相关产品推荐
相关产品推荐

