es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Por qué la URI de solicitud de este HttpRequestMessage es inválida?

Estoy tratando de escribir una prueba de integración donde pruebo la funcionalidad de registro de mi aplicación. Este es el controlador:

[Route("account")]
public class IdentityController : MainController
{
    // ...
}

[HttpGet("signup")]
public IActionResult SignUp()
{
    return View();
}

[HttpPost("signup")]
public async Task<iactionresult> SignUp(UserSignUpViewModel signUp)
{
    if (!ModelState.IsValid)
    {

Estoy siguiendo un entrenamiento en línea y, según el video, así como otros ejemplos, esto es cómo se suponía que debía hacerse para poder probar el envío del formulario:

[Fact]
public async Task IdentityCreateUserShouldBeSuccessful()
{
    // Arrange
    var initialResponse = await _fixture.Client.GetAsync("/account/signup");
    initialResponse.EnsureSuccessStatusCode();

    var antiForgeryToken = _fixture.GetAntiForgeryToken(await initialResponse.Content.ReadAsStringAsync());

    var postRequest = new HttpRequestMessage(HttpMethod.Post, "/account/signup")
    {
        Content = new FormUrlEncodedContent(new Dictionary<string, string="">
        {
            { "Name", "John Malone Doe" },
            // ...
        }
    }

    // Act
    var response = await _fixture.Client.SendAsync(postRequest);

    // ...
}

Rider incluso autocompletará la ruta por mí, pero fallará con un mensaje que dice:

System.InvalidOperationException: Se proporcionó una URI de solicitud no válida. La URI de solicitud debe ser una URI absoluta o se debe establecer BaseAddress.

Intenté pasar la dirección completa, “https://localhost:5001/account/signup”, y también escribir el código de esta manera:

var postRequest = new HttpRequestMessage
{
    Method = HttpMethod.Post,
    RequestUri = new Uri("https://localhost:5001/account/signup"),
    Content = new FormUrlEncodedContent(new Dictionary<string, string="">
    {

Ninguna solución funcionó.</string,></string,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para resolver este problema, es necesario actualizar la propiedad BaseAddress del objeto HttpClient con la URL base de tu aplicación. Aquí te explico cómo puedes hacerlo:

    // Arrange
    _fixture.Client.BaseAddress = new Uri("https://localhost:5001/");
    
    var initialResponse = await _fixture.Client.GetAsync("/account/signup");
    initialResponse.EnsureSuccessStatusCode();
    
    var antiForgeryToken = _fixture.GetAntiForgeryToken(await initialResponse.Content.ReadAsStringAsync());
    
    var postRequest = new HttpRequestMessage(HttpMethod.Post, "/account/signup")
    {
        Content = new FormUrlEncodedContent(new Dictionary<string, string="">
        {
            { "Name", "John Malone Doe" },
            // ...
        })
    };
    
    // Act
    var response = await _fixture.Client.SendAsync(postRequest);
    
    // ...
    

    Al establecer la propiedad BaseAddress, el HttpClient automáticamente añadirá el URI relativo (“/account/signup” en este caso) a la URL base (“https://localhost:5001/”) para crear el URI absoluto (“https://localhost:5001/account/signup”). Esto debería solucionar la excepción “Se proporcionó un URI de solicitud no válido”.</string,>

Comments are closed.