Konwertując aplikację ASP.NET MVC (.NET Framework) do ASP.NET Core MVC. Jest to ściśle konwersja, nie mogę dokonać żadnych zmian zerwania, więc nie mogę zmienić żadnych tras ani metod. Nie mogę dopasować tej samej funkcjonalności w ASP.NET Core MVC.

Pracujący ASP.NET MVC:

  [HttpPut]
  [Route("status")]
  public async Task<IHttpActionResult> UpdateStatusByOrderGuid([FromUri] Guid orderGUID, [FromBody] POST_Status linkStatusModel)
  {

  }

  [HttpPut]
  [Route("status")]
  public async Task<IHttpActionResult> UpdateStatusById([FromUri] Guid id, [FromBody] POST_Status linkStatusModel)
  {

  }

Nie działa, asp.net Core MVC.

Pojawia się błąd:

Microsoft.aspnetcore.Routing.Matching.ammiguousMatchException: Żądanie dopasowane wiele punktów końcowych

Kod:

    [HttpPut]
    [Route("status")]
    public async Task<IActionResult> UpdateStatusByOrderGuid([FromQuery] Guid orderGUID, [FromBody] POST_Status statusModel)
    {

    }

    [HttpPut]
    [Route("status")]
    public async Task<IActionResult> UpdateStatusById([FromQuery] Guid id, [FromBody] POST_Status statusModel)
    {

    }

Muszę zawierać parametry zapytania, gdy rozwiązuje się, która trasa. Powinien pasować na podstawie tego, czy orderGUID lub id jest w ciągu żądania.

Dzięki.

1
Neurion 20 marzec 2020, 05:39

2 odpowiedzi

Najlepsza odpowiedź

Dlaczego nie używać pojedynczego punktu końcowego zamiast tego? Nie musisz przekazywać identyfikatora GUID, ponieważ jest to operacja Get, możesz przekazywać łańcuchy i rzucić je później. W ten sposób możesz wysłać jeden parametr lub drugi.

[HttpPut]
[Route("status")]
public async Task<IActionResult> UpdateStatus([FromBody] POST_Status statusModel, [FromQuery] string orderGUID = null, [FromQuery] string id = null)
{
    if (!string.IsNullOrEmpty(orderGUID))
    {
        // UpdateStatusByOrderGuid implementation here
        // Guid guid = Guid.Parse(orderGUID);

    }
    else if (!string.IsNullOrEmpty(id))
    {
        // UpdateStatusById implementation here
        // Guid guid = Guid.Parse(id);
    }
    else
    {
        throw new ArgumentException("No valid GUID.");
    }
}

Ten punkt końcowy powinien być kompatybilny z określonymi scenariuszami.

1
anber 26 marzec 2020, 04:14

Musisz być niestandardowy ActionMethodSelectorAttribute:

1.QueryStringCrudstraintRibute:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true)]
public class QueryStringConstraintAttribute : ActionMethodSelectorAttribute
{
    public string ValueName { get; private set; }
    public bool ValuePresent { get; private set; }
    public QueryStringConstraintAttribute(string valueName, bool valuePresent)
    {
        this.ValueName = valueName;
        this.ValuePresent = valuePresent;
    }
    public override bool IsValidForRequest(RouteContext routeContext, ActionDescriptor action)
    {
        var value = routeContext.HttpContext.Request.Query[this.ValueName];
        if (this.ValuePresent)
        {
            return !StringValues.IsNullOrEmpty(value);
        }
        return StringValues.IsNullOrEmpty(value);
    }
}

2. Controller:

[HttpPut]
[Route("status")]
[QueryStringConstraint("orderGUID",true)]
[QueryStringConstraint("id", false)]
public void UpdateStatusByOrderGuid([FromQuery] Guid orderGUID,[FromBody]POST_Status model)
{

}

[HttpPut]
[Route("status")]
[QueryStringConstraint("id", true)]
[QueryStringConstraint("orderGUID", false)]
public void UpdateStatusById([FromQuery] Guid id, [FromBody]POST_Status model)
{

}

3.Startup.cs:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    //...
    app.UseMvc(routes =>
    {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
    });
}

Wynik: Wpisz opis obrazu tutaj

2
Rena 20 marzec 2020, 07:22