【问题标题】:500 Error when trying to access SAP Service Layer through C# Application尝试通过 C# 应用程序访问 SAP 服务层时出现 500 错误
【发布时间】:2019-04-05 11:47:00
【问题描述】:

我正在编写一个与 SAP B1 服务层交互的 C# 应用程序,我正在尝试通过 HTTP POST 调用登录,使用 JSON 作为正文。

如果我使用 POSTMAN 发送登录请求,它会正常登录,并且我会按预期收到会话 cookie。当我通过我的 C# 应用程序发送 JSON 时,我收到 500 错误 - 我完全不知道为什么。我有另一种方法发送对特定项目的请求,该请求返回 401 - 未经授权,所以我知道它正在访问服务层。

下面是目前方法中的代码。

var request = (HttpWebRequest)WebRequest.Create("https://172.16.101.38:50000/b1s/v1/Login");
            request.ContentType = "application/json";
            request.Method = "POST";
            request.ServerCertificateValidationCallback = AcceptAllCertifications;

            using (var streamWriter = new StreamWriter(request.GetRequestStream()))
            {
                string json = new JavaScriptSerializer().Serialize(new
                {
                    UserName = "user",
                    Password = "pass",
                    CompanyDB = "db"
                });

                streamWriter.Write(json);
            }

            var response = (HttpWebResponse)request.GetResponse();
            using (var streamReader = new StreamReader(response.GetResponseStream()))
            {
                var result = streamReader.ReadToEnd();
            }

而“AcceptAllCertifications”方法如下:

public bool AcceptAllCertifications(object sender, System.Security.Cryptography.X509Certificates.X509Certificate certification, 
        System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors sslPolicyErrors)
    {
        return true;
    }

如果我不包含此方法,我会收到“无法为 SSL/TLS 安全通道建立信任关系...”错误。在 POSTMAN 中,我必须确保“SSL 证书验证”处于关闭状态,以便我可以访问服务层。

我知道生成的 JSON 是有效的,因为我在 POSTMAN 中对其进行了测试。

之前有人遇到过这个问题并设法弄清楚如何纠正这个问题?

【问题讨论】:

  • “我收到 500 错误 - 我完全不知道为什么” - 来自谁,来自您的 Web 应用程序,还是来自 SAP Web 服务?无论哪种方式,获取实际错误,“500”与“错误”一样无用。它可能与 TLS 1.2 有关,但这只是猜测。
  • @CodeCaster 错误来自 SAP 的 Web 服务。我想查看错误日志以获取实际错误,但很遗憾我无法访问它们。
  • 那么,您必须请维护 SAP 服务的人员来帮助您。我们没有任何有用的信息可以这样做。
  • @Adyson 幸运的是,我现在正在获取一些日志,所以当我弄清楚时,我将能够(希望)提供答案。这个问题更希望其他人发生类似的事情,他们设法纠正,以防获取所述日志的时间比预期的要长。
  • 我明白了,但不幸的是我们不知道“类似的东西”是什么......错误可能是一百件事

标签: c# json post sap


【解决方案1】:

这是我必须实施的解决方案的链接:

SAP Consume OData Services

因此,我不必尝试通过 JSON 访问所有内容,而是必须从这里获取一些代码,这些代码创建一个服务层实例并通过其中实现的方法登录。

刚开始工作非常繁琐,但一旦开始工作,它就相当稳定了。

【讨论】:

    【解决方案2】:

    在您的请求中添加以下行。

    request.ServicePoint.Expect100Continue = false;
    

    【讨论】:

    • 嗨,欢迎来到 SO。感谢您的回答。通过解释这如何解决已发布的问题,可以提高答案的寿命(特别是因为这个问题已经存在两年多了,提问者可能不再关心这个问题了)。
    • 您好,感谢您的回答! @ConnorLow 是对的,我不再关心这个了;但是,如果这个答案比我自己发布的答案更好,那就太好了!请详细说明这行代码的工作原理以及它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多