2017-03-09 7 views
3

Ich habe ein HttpContext.Request -Objekt, das Daten in der Form hat, die falsch ist, und ich möchte es reparieren und senden Sie den richtigen HttpContext auf dem Weg. HttpContext.Request.Form ist schreibgeschützt, aber wenn nicht, hätte ich einfach folgendes getan; HttpContext.Request.Form ["a"] = "der korrekte Wert für a";Wie zu ändern HttpContext.Request.Form in asp.net Kern

Also, wo ist der beste Platz in der Pipeline, dies zu tun. Ist es möglich, die HttpContext.Request.Form schreibbar über Reflektion zugänglich zu machen?

+0

Was genau meinen Sie mit „dem richtigen sendet Httpcontext auf dem Weg?“ Übergeben Sie es an eine andere Methode/ein anderes Objekt oder versuchen Sie, es an den Client zurückzusenden? – greenjaed

+0

Ich interceptiere eingehende Anfragen und korrigiere fehlerhafte Formulardaten in der Middleware und sende gute Formulardaten in den Rest der eingehenden Pipeline. –

Antwort

4

Das war einfacher als ich dachte. Ich tue dies in meiner Middleware, die es schlechte Stil Daten zu korrigieren, die in kamen.

public async Task Invoke(HttpContext context) 
{ 
    .... 
    NameValueCollection fcnvc = context.Request.Form.AsNameValueCollection(); 
    fcnvc.Set("a", "the correct value of a"); 
    fcnvc.Set("b", "a value the client forgot to post"); 
    Dictionary<string, StringValues> dictValues = new Dictionary<string, StringValues>(); 
    foreach (var key in fcnvc.AllKeys) 
    { 
     dictValues.Add(key, fcnvc.Get(key)); 
    } 
    var fc = new FormCollection(dictValues); 
    context.Request.Form = fc; 
    .... 
    await _next.Invoke(context); 
} 

Interessanterweise ist die Formcollection nur lesbar ist, aber das HttpContext.Request Objekt ist nicht so dass mir das gesamte Formular ersetzen.

+0

Ich habe keine AsNameValueCollection-Erweiterungsmethode! wo ist es? –

+0

AsNameValueCollection ist innerhalb von IdentityServer4.dll, ich habe den Quellcode unten veröffentlicht. –

1

AsNameValueCollection ist innerhalb von IdentityServer4.dll.

public static class IReadableStringCollectionExtensions 
{ 
    [DebuggerStepThrough] 
    public static NameValueCollection AsNameValueCollection(this IDictionary<string, StringValues> collection) 
    { 
     NameValueCollection values = new NameValueCollection(); 
     foreach (KeyValuePair<string, StringValues> pair in collection) 
     { 
      string introduced3 = pair.get_Key(); 
      values.Add(introduced3, Enumerable.First<string>(pair.get_Value())); 
     } 
     return values; 
    } 

    [DebuggerStepThrough] 
    public static NameValueCollection AsNameValueCollection(this IEnumerable<KeyValuePair<string, StringValues>> collection) 
    { 
     NameValueCollection values = new NameValueCollection(); 
     foreach (KeyValuePair<string, StringValues> pair in collection) 
     { 
      string introduced3 = pair.get_Key(); 
      values.Add(introduced3, Enumerable.First<string>(pair.get_Value())); 
     } 
     return values; 
    } 
}