首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用.NET框架连接SAP Business One Service层

如何使用.NET框架连接SAP Business One Service层
EN

Stack Overflow用户
提问于 2021-10-06 15:27:34
回答 2查看 745关注 0票数 0

我无法使用.NET框架连接SAP Business One Service Layer。它抛出错误:内部服务器错误,状态代码为500。

代码语言:javascript
复制
    HttpClient client = new HttpClient();
    string json = JsonConvert.SerializeObject(new {
                                            CompanyDB = "company",
                                            UserName = "username",
                                            Password = "password"
                                            }
                                      );
    var response = await client.PostAsync("service layer URL", new StringContent(json, 
    Encoding.Default, "application/json"));

尽管我可以用相同的代码使用.NET核心应用程序连接到服务层。

我已经浏览了这个博客https://blogs.sap.com/2015/07/15/how-to-consume-service-layer-odata-services-from-net-via-wcf/

但是我无法为服务层添加服务引用。我不确定这个问题是属于服务层还是属于我的程序。我们是否需要编写额外的代码才能从OData框架调用.net服务(因为服务层是oData、V3或V4)?请帮我解决这个问题。

EN

回答 2

Stack Overflow用户

发布于 2021-10-11 13:57:21

关于您的登录问题,您可以截获从您的两个应用程序( HTTP与.NET核心)发送的HTTP消息,并对它们进行比较。例如通过使用Fiddler。您可能会发现一个阻止SL处理您的请求的小差异。

通过使用RestSharp库,我能够在.NET核心项目中成功地连接到SL。也许这会让你开始:

代码语言:javascript
复制
private static void Main(string[] args)
{
  var client = new RestClient("https://<host>:<port>/b1s/v2");
  client.RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) =>
  {
    // allow all certificates for testing purposes
    return true;
  };
  var resolver = new CamelCasePropertyNamesContractResolver();
  // respect the names defined in the JsonProperty annotations
  resolver.NamingStrategy.OverrideSpecifiedNames = false;
  client.UseNewtonsoftJson(new JsonSerializerSettings() { ContractResolver = resolver });

  var loginRequest = new RestRequest("Login");
  loginRequest.AddJsonBody(new LoginBody() { CompanyDB = "yourCompanyDb", UserName = "user1", Password = "myPassword" });
  var response = client.Post<LoginResponse>(loginRequest);

  if (response.Data != null)
  {
    var itemRequest = new RestRequest("Items('57387')"); // get an item
    // add the session cookie
    itemRequest.AddHeader("Cookie", $"B1SESSION={response.Data.SessionId}");
    var itemResponse = client.Get<Items>(itemRequest);
  }
}

JSON POCOs:

代码语言:javascript
复制
  public class LoginBody
  {
    [JsonProperty("CompanyDB")]
    public string CompanyDB { get; set; }

    [JsonProperty("Password")]
    public string Password { get; set; }

    [JsonProperty("UserName")]
    public string UserName { get; set; }
  }
  
  public class LoginResponse
  {
    [JsonProperty("SessionId")]
    public string SessionId { get; set; }
  }
  
  public class Items
  {
    [JsonProperty("ItemCode")]
    public string ItemCode { get; set; }

    [JsonProperty("ItemName")]
    public string ItemName { get; set; }
  }

关于您提出的添加服务引用的问题,我不确定您想要实现什么。如果您希望生成一个包含所有必需的类和数据模型的OData客户端,那么您可能需要查看Unchase OData Connected Service Visual Studio扩展。对我来说,这工作得很好,因为它基于Microsoft.OData.Client.DataServiceContext类生成了一个正常工作的SL/OData客户机。有关如何使用它的更多示例,请参阅OData client documentation

票数 0
EN

Stack Overflow用户

发布于 2022-02-17 19:10:01

我写了一个名为B1SLayer的库,旨在使用.NET简化服务层请求,请看一下:

https://github.com/bgmulinari/B1SLayer/

https://www.nuget.org/packages/B1SLayer/

只需创建您的SLConnection实例,会话就会被自动管理。请查看GitHub页面以获取请求样本。

代码语言:javascript
复制
var serviceLayer = new SLConnection("https://sapserver:50000/b1s/v1", "CompanyDB", "manager", "12345");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69468528

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档