简体   繁体   English

如何从C#应用程序向BugTracker.NET提交错误?

[英]How to submit bugs to BugTracker.NET from C# application?

Reading the documentation page of BugTracker.NET 阅读BugTracker.NET的文档页面
BugTracker.NET API Documentation I realized that I need to use GET or POST which, I have to admit, I'm not very good at. BugTracker.NET API文档我意识到我需要使用GET或POST,我不得不承认,我不太擅长。 I was wondering: 我在想:

  • Is there a library that could be used to easily submit bugs to BugTracker.NET from a C# application (or VB.NET) ? 是否有一个库可以用来轻松地从C#应用程序(或VB.NET)向BugTracker.NET提交错误?
    Or, 要么,
  • If there's no library. 如果没有图书馆。 How can use GET or POST to submit bugs to BugTracker.NET ? 如何使用GET或POST将错误提交到BugTracker.NET?

Check this simple example from the documentation of how to make a POST request using .Net. 如何使用.Net发出POST请求的文档中检查这个简单的示例。 Just make sure to set up the variables being POSTed in according to BugTracker.NET API requirements. 只要确保根据BugTracker.NET API要求设置要发布的变量即可。

Below is the code from BugTracker.NET's service which reads emails from a pop3 server and then submits them as bugs to the insert_bug.aspx page. 下面是BugTracker.NET服务的代码,该服务从pop3服务器读取电子邮件,然后将它们作为bug提交到insert_bug.aspx页面。 But it doesn't have to be this complicated. 但这不必太复杂。

Just invoking this URL will also work: 只需调用此URL也可以:

http:\\YOUR-HOST\insert_bug.aspx?username=YOU&password=YOUR-PASSWORD&short_desc=This+is+a+bug

The more complicated code: 更复杂的代码:

string post_data = "username=" + HttpUtility.UrlEncode(ServiceUsername)
                + "&password=" + HttpUtility.UrlEncode(ServicePassword)
                + "&projectid=" + Convert.ToString(projectid)
                + "&from=" + HttpUtility.UrlEncode(from)
                + "&short_desc=" + HttpUtility.UrlEncode(subject)
                + "&message=" + HttpUtility.UrlEncode(message);

            byte[] bytes = Encoding.UTF8.GetBytes(post_data);


            // send request to web server
            HttpWebResponse res = null;
            try
            {
                HttpWebRequest req = (HttpWebRequest) System.Net.WebRequest.Create(Url);


                req.Credentials = CredentialCache.DefaultCredentials;
                req.PreAuthenticate = true; 

                //req.Timeout = 200; // maybe?
                //req.KeepAlive = false; // maybe?

                req.Method = "POST";
                req.ContentType= "application/x-www-form-urlencoded";
                req.ContentLength=bytes.Length;
                Stream request_stream = req.GetRequestStream();
                request_stream.Write(bytes,0,bytes.Length);
                request_stream.Close();
                res = (HttpWebResponse) req.GetResponse();
            }
            catch (Exception e)
            {
                write_line("HttpWebRequest error url=" + Url);
                write_line(e);
            }

            // examine response

            if (res != null) {

                int http_status = (int) res.StatusCode;
                write_line (Convert.ToString(http_status));

                string http_response_header = res.Headers["BTNET"];
                res.Close();

                if (http_response_header != null)
                {
                    write_line (http_response_header);

                    // only delete message from pop3 server if we
                    // know we stored in on the web server ok
                    if (MessageInputFile == ""
                    && http_status == 200
                    && DeleteMessagesOnServer == "1"
                    && http_response_header.IndexOf("OK") == 0)
                    {
                        write_line ("sending POP3 command DELE");
                        write_line (client.DELE (message_number));
                    }
                }
                else
                {
                    write_line("BTNET HTTP header not found.  Skipping the delete of the email from the server.");
                    write_line("Incrementing total error count");
                    total_error_count++;
                }
            }
            else
            {
                write_line("No response from web server.  Skipping the delete of the email from the server.");
                write_line("Incrementing total error count");
                total_error_count++;
            }

I was using that method but did not like sending the password along with the submitted bug. 我正在使用该方法,但不喜欢将密码与提交的错误一起发送。 For various reasons, we are using the internal BugTracker password system and not LDAP authentication, so their BugTracker passwords are not known to us. 由于各种原因,我们使用的是内部BugTracker密码系统,而不是LDAP身份验证,因此我们不知道其BugTracker密码。 In my case, all of our users are authorized to submit bugs, and their login is their LAN ID. 就我而言,我们所有用户均有权提交错误,并且他们的登录名是其LAN ID。 So, from their authenticated instance of the application, I collect their reported issue, capture the project ID, program and class where they are reporting the issue, and call a stored procedure in the BugTracker DB to directly insert the item. 因此,从他们经过身份验证的应用程序实例中,我收集了他们报告的问题,捕获了他们报告问题的项目ID,程序和类,并在BugTracker DB中调用了存储过程以直接插入项目。

The negative of course is that this is directly into the database and potentially could cause issues with future upgrades, but it is working well for us now. 当然不利的是,它直接进入数据库,并可能在将来的升级中引起问题,但现在对我们来说很好。

(SQL2005/2008) (SQL2005 / 2008)

CREATE PROCEDURE [dbo].[Add_Bug]
@strUsername as varchar(20) = '', 
@intProjID as integer = 0,
@strSubject as varchar(200),
@strComment as text
AS
    BEGIN
SET NOCOUNT ON;

declare @us_id as integer
declare @us_org as integer
declare @st_id as integer
declare @priority as integer
declare @category as integer
declare @errorreturn as integer
declare @assigneduser as integer

declare @newbugid as integer

if (@intProjID = 0 or RTRIM(@strUsername) = '') 
    RETURN -1

set @priority = 3 -- default to LOW
set @category = 1 -- default to bug

-- look up us_id, us_org from users where us_username = 'lanid'

set @us_id = 0

BEGIN TRY

    BEGIN TRANSACTION

    select @us_id = us_id, @us_org = us_org from BugTracker.dbo.users 
    where us_username = @strUsername

    if (@@ROWCOUNT = 0 or @us_id = 0 )
    BEGIN
        -- set to default values to allow entry anyway
        -- if not found default to the autobug reporter
                    -- this is a separate account created just for these reports
        set @us_id = 36     
        set @us_org = 6     
    END

    select @assigneduser = pj_default_user from projects 
                    where pj_id = @intProjID and 
        pj_auto_assign_default_user = 1

    if (@@ROWCOUNT <> 1)
        set @assigneduser = NULL

    -- get default status as st_id from statuses where st_default = 1

    select @st_id = st_id from BugTracker.dbo.statuses where st_default = 1 

    -- now insert the bug and post comments

    insert into bugs (bg_short_desc, bg_reported_user, bg_reported_date,
            bg_status, bg_priority, bg_org, bg_category, bg_project,                     
            bg_assigned_to_user, bg_last_updated_user, bg_last_updated_date) 
    values ( @strSubject, @us_id, getdate(), @st_id, @priority, @us_org,
            @category, @intProjID, @assigneduser, @us_id, getdate())

    if @@ERROR <> 0
        BEGIN
        ROLLBACK TRANSACTION
        END
    ELSE
        BEGIN

        select @newbugid = @@IDENTITY

        insert into bug_posts (bp_bug, bp_type, bp_user, bp_date,
                    bp_comment, bp_hidden_from_external_users)
        values (@newbugid, 'comment', @us_id, getdate(), @strComment, 0)

        if @@ERROR <> 0
            ROLLBACK TRANSACTION
        END
END TRY

BEGIN CATCH
    ROLLBACK TRANSACTION
    RETURN -2
END CATCH   

IF (@@TRANCOUNT > 0)
    COMMIT TRANSACTION

RETURN @newbugid

END

Thank you all for your answers. 谢谢大家的答案。 Using your answers and other resources on the web, I've put together a method for submitting a new bug to BugTracker.NET 使用您在网络上的答案和其他资源,我整理了一种向BugTracker.NET提交新错误的方法
The method returns a boolean value indicating success or failure and it displays a message to the user with the status. 该方法返回一个指示成功或失败的布尔值,并向用户显示一条状态消息。
This behavior could be changed to match your needs. 可以更改此行为以符合您的需求。 The method uses POST method to submit bugs which helps to submit any long text in the comment (I've tried to submit the content of a log file in the comments and it worked). 该方法使用POST方法提交错误,该错误有助于在评论中提交任何长文本(我尝试在评论中提交日志文件的内容,并且可以正常工作)。

Here's the code: 这是代码:

public bool SubmitBugToBugTracker(string serverName,
                                        bool useProxy,
                                        string proxyHost,
                                        int proxyPort,
                                        string userName,
                                        string password,
                                        string description,
                                        string comment,
                                        int projectId)
    {
        if (!serverName.EndsWith(@"/"))
        {
            serverName += @"/";
        }
        string requestUrl = serverName + "insert_bug.aspx";
        string requestMethod = "POST";
        string requestContentType = "application/x-www-form-urlencoded";
        string requestParameters = "username=" + userName
                                  + "&password=" + password
                                  + "&short_desc=" + description
                                  + "&comment=" + comment
                                  + "&projectid=" + projectId;
        // POST parameters (postvars)
        byte[] buffer = Encoding.ASCII.GetBytes(requestParameters);
        // Initialisation
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(requestUrl);
        // Add proxy info if used.
        if (useProxy)
        {
            WebReq.Proxy = new WebProxy(proxyHost, proxyPort);
        }

        // Method is POST
        WebReq.Method = requestMethod;
        // ContentType, for the postvars.
        WebReq.ContentType = requestContentType;
        // Length of the buffer (postvars) is used as contentlength.
        WebReq.ContentLength = buffer.Length;
        // Open a stream for writing the postvars
        Stream PostData = WebReq.GetRequestStream();
        //Now we write, and afterwards, we close. Closing is always important!
        PostData.Write(buffer, 0, buffer.Length);
        PostData.Close();
        // Get the response handle, we have no true response yet!
        HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
        // Read the response (the string)
        Stream Answer = WebResp.GetResponseStream();
        StreamReader _Answer = new StreamReader(Answer);
        string responseStream = _Answer.ReadToEnd();

        // Find out if bug submission was successfull.
        if (responseStream.StartsWith("OK:"))
        {
            MessageBox.Show("Bug submitted successfully.");
            return true;
        }
        else if (responseStream.StartsWith("ERROR:"))
        {
            MessageBox.Show("Error occured. Bug hasn't been submitted.\nError Message: " + responseStream);
            return false;
        }
        else
        {
            MessageBox.Show("Error occured. Bug hasn't been submitted.\nError Message: " + responseStream);
            return false;
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM