¿Cómo enviar errores a BugTracker.NET desde la aplicación C#?
-
19-09-2019 - |
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?
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