Jenkins在向API发送删除请求时返回(403)Forbidden

时间:2016-01-06 16:45:21

标签: c# api post jenkins

我正在尝试使用C#脚本删除Jenkins作业。 当我运行代码时,它确实有效。该作业已删除。但是,Jenkins仍然会返回403错误。我做错了吗?

这是我的代码:

String credentials = ConfigurationManager.AppSettings["jenkinsUser"] + ":" + ConfigurationManager.AppSettings["jenkinsKey"];
String authorization = Convert.ToBase64String(Encoding.ASCII.GetBytes(credentials));
try
{
    using (WebClient wc = new WebClient())
    {
        wc.Headers[HttpRequestHeader.Authorization] = "Basic " + authorization;
        string HtmlResult = wc.UploadString(ConfigurationManager.AppSettings["jenkinsDeleteJobUrl"], "POST", "");
        Console.WriteLine("Success");
    }
}
catch(WebException e)
{
    Console.WriteLine("Something went wrong");
    throw e;
}

我使用的网址是[My Jenkins网址] / job / {0} / doDelete

我也尝试过使用HttpWebRequest,结果相同。希望有人知道答案。

[编辑] 请注意,当我使用Postman执行相同的请求时,它会顺利执行,重定向到Jenkins主页,返回码为200.

这是邮递员的电话:

POST /job/[jobname]/doDelete HTTP/1.1
Host: [my jenkins url]
Authorization: Basic [my auth hash]
Cache-Control: no-cache

1 个答案:

答案 0 :(得分:0)

我认为问题在于,当您使用doDelete网址删除Jenkins作业时,您会被重定向到您的Jenkins主页。由于您以编程方式执行此操作,因此Jenkins无法识别用户会话(即使您的原始请求包含Authorization标头),从而导致禁用代码。

作为一种解决方法,我做了以下事情:

class BASE{
    int a, b;
public:
    BASE(){}

    BASE(int a, int b){
        this->a = a;
        this->b = b;
    }
    void setC(int){}
    int getC(){}
};

class Derived : public BASE{
    int c;
public:
    void setC(int c) {
        this->c = c;
    }
    int getC() {
        return c;
    }
};


int main(int argc, const char * argv[]) {

vector<BASE> d;

d.push_back(BASE(1,1));

d[0].setC(5);
cout << d[0].getC();
}

使用此辅助函数,其中JenkinsJobListUrl = [MyJenkinsUrl] / api / xml?xpath = hudson / job / name&amp; wrapper = jobs

public final class AppReactPackage implements ReactPackage {

  @Override
  public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
    addExceptionHandler(reactContext);
  }

  private void addExceptionHandler(ReactApplicationContext reactContext) {
    // Fyi, this is using Retrolambda for Java 8 syntax
    reactContext.setNativeModuleCallExceptionHandler(e -> {
      if (e instanceof JavascriptException) {
        Crashlytics.log(e.getMessage());
      } else {
        Crashlytics.logException(e);
      }
    });
  }
}

我知道它并不漂亮,但由于缺乏更好的解决方案,这可以完成工作。

希望这也有助于那些一直在努力解决这个问题的人们。如果您找到更好的解决方案,请告诉我。