Pregunta

Leyendo la página de documentación de BugTracker.NET
Documentación de la API BugTracker.NETMe di cuenta de que necesito usar GET o POST, lo cual, debo admitir, no soy muy bueno.Me preguntaba:

  • ¿Existe una biblioteca que pueda usarse para enviar errores fácilmente a BugTracker.NET desde una aplicación C# (o VB.NET)?
    O,
  • Si no hay biblioteca.¿Cómo se pueden utilizar GET o POST para enviar errores a BugTracker.NET?
¿Fue útil?

Solución 3

Gracias a todos por sus respuestas. Usando sus respuestas y otros recursos en la web, he elaborado un método para la presentación de un nuevo error de BugTracker.NET
El método devuelve un valor booleano que indica el éxito o el fracaso y muestra un mensaje al usuario con el estado.
Este comportamiento podría cambiarse para adaptarse a sus necesidades. El método utiliza el método POST para enviar errores que ayuda a presentar cualquier texto largo en el comentario (He tratado de presentar el contenido de un archivo de registro en los comentarios y funcionó).

Aquí está el código:

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;
        }
    }

Otros consejos

Comprobar este sencillo ejemplo de la documentación de cómo hacer una solicitud POST usando .Net. Sólo asegúrese de configurar las variables que se ha escrito en acuerdo con los requerimientos de API BugTracker.NET.

A continuación se muestra el código de servicio de BugTracker.NET que se lee mensajes de correo electrónico desde un servidor POP3 y luego los presenta como errores a la página insert_bug.aspx. Pero esto no tiene por qué ser complicado.

Al igual que invoca esta URL también funcionará:

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

El código más complicado:

            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++;
            }

Estaba usando ese método pero no me gustaba enviar la contraseña junto con el error enviado.Por varias razones, utilizamos el sistema de contraseñas interno de BugTracker y no la autenticación LDAP, por lo que no conocemos sus contraseñas de BugTracker.En mi caso, todos nuestros usuarios están autorizados a enviar errores y su inicio de sesión es su ID de LAN.Entonces, desde su instancia autenticada de la aplicación, recopilo el problema informado, capturo el ID del proyecto, el programa y la clase donde informan el problema, y ​​llamo a un procedimiento almacenado en la base de datos BugTracker para insertar directamente el elemento.

Lo negativo, por supuesto, es que esto está directamente en la base de datos y potencialmente podría causar problemas con futuras actualizaciones, pero ahora nos está funcionando bien.

(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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top