2

我想在 P6 Web 服务中使用基于 Cookie 的身份验证,我遵循以下两个链接

  1. http://docs.oracle.com/cd/E16281_01/Technical_Documentation/Web_Services/ProgrammersGuide/Logging_into_Primavera_Web_Services.htm#dotnetexample
  2. http://docs.oracle.com/cd/E16281_01/Technical_Documentation/Web_Services/ProgrammersGuide/whnjs.htm

现在我可以使用基于 cookie 的身份验证登录,但是当我尝试继续下一步时,我感到震惊。

例如。我想在 P6 DB 中创建一个新活动,我按照以下步骤操作。

  1. 登录系统(创建 Cookie 容器):我为 AuthenticationService.wsdl 添加了服务参考

    System.Net.CookieContainer cookieContainer;
    public void Login(String userName, String password)
    {
    
        AuthenticationServiceWebRef.AuthenticationService authService = new  AuthenticationServiceWebRef.AuthenticationService();
        authService.CookieContainer = new System.Net.CookieContainer();
    
        authService.Url = ConfigurationManager.AppSettings["WSAuthenticationService"];
        AuthenticationServiceWebRef.Login loginObj = new AuthenticationServiceWebRef.Login();
        loginObj.UserName = userName;
        loginObj.Password = password;
        loginObj.DatabaseInstanceId = 1;
        loginObj.DatabaseInstanceIdSpecified = true;
        AuthenticationServiceWebRef.LoginResponse loginReturn = authService.Login(loginObj);
        cookieContainer = authService.CookieContainer;
    }
    
  2. 创建活动:我为 ActivityService?wsdl 添加服务引用

            Login(WSUsername, WSPassword);
            ActivityPortBinding apb = new ActivityPortBinding();
            apb.CookieContainer = cookieContainer;
            apb.Url = ConfigurationManager.AppSettings["WSGetDataByID"];
            Activity[] acts;
            acts = new Activity[1];
    
            Activity activity = null;
            for (int i = 0; i < 1; i++)
            {
                activity = new Activity();
                activity.ProjectObjectId = iProjectObjectID;
                activity.ProjectObjectIdSpecified = true;
                activity.Id = "P6 Test" + (i + 1);
                activity.Name = "P6 Test" + (i + 1);
                acts[i] = activity;
            }
            int [] arrayObjectIDs= apb.CreateActivities(acts);
            iRetActivityObjectID = arrayObjectIDs[0];
    

问题出现在第二步,我无法创建 ActivityPortBinding 类。

错误:找不到类型或命名空间名称“ActivityPortBinding”(您是否缺少 using 指令或程序集引用?)

  1. 你能帮我找出我在上面的代码中出错的地方吗?
  2. 我在步骤 1 中调用了正确的 Login() 吗?
  3. 我应该在 Step2 中使用哪个参考 ActivityPortBinding 类?

提前致谢!

4

2 回答 2

0

引用活动 Web 服务后,您应该只创建一个 AcitvityService 对象并将 cookiecontainer 分配给 ActivityService 对象。如下假设您的活动服务的 Web 服务文件夹名为 ActivityWS 并且您的身份验证服务名为 AuthenWS

    static System.Net.CookieContainer cookieContainer;
    static void Main(string[] args)
    {

        AuthenWS.AuthenticationService authService = new AuthenWS.AuthenticationService();
        authService.CookieContainer = new System.Net.CookieContainer();


        AuthenWS.Login loginObj = new AuthenWS.Login();
        loginObj.UserName = "xxx";
        loginObj.Password = "yyy*";
        loginObj.DatabaseInstanceId = 1;
        loginObj.DatabaseInstanceIdSpecified = true;
        AuthenWS.LoginResponse loginReturn = authService.Login(loginObj);
        if (loginReturn.Return == true) cookieContainer = authService.CookieContainer;
        else {
            Console.WriteLine ("login failed");
            return;
        }

        ActivityWS.ActivityService acService = new ActivityWS.ActivityService;
        acService.CookieContainer = cookieContainer;
        ActivityWS.Activity [] acts;
        acts = new ActivityWS.Activity[1];

        ActivityWS.Activity activity = null;
        for (int i = 0; i < 10; i++)
       {
        activity = new ActivityWS.Activity();
        activity.ProjectObjectId = iProjectObjectID;
        activity.ProjectObjectIdSpecified = true;
        activity.Id = "P6 Test" + (i + 1);
        activity.Name = "P6 Test" + (i + 1);
        acts[i] = activity;
       }

      acService.CreateActivities(acts);    

  }
于 2014-10-15T23:47:23.630 回答
0
act1.ReadActivities(act)

这行代码给出了 null 或数组长度为零。P6 已经加载了数据。P6端是否有设置

于 2019-10-23T13:58:12.603 回答