Есть ли способ установить HttpResponse? - PullRequest
1 голос
/ 01 февраля 2011

У меня есть следующий код, который я использую для установки строки запроса HttpRequest.Я хочу сделать то же самое для Request.Form.

Я делаю это, чтобы взломать некоторые юнит-тесты вместе.Я хочу сделать то же самое для Request.Form, и я не думаю, что на этом этапе меня интересует насмешка в поисках взлома.

Существующий взлом Querystring ....

private string _queryString;
public string QueryString
{
    get { return _queryString; }
    set
    {
        _queryString = value;
        HttpContext.Current = new HttpContext(new HttpRequest(null, "http://tempuri.org", value), new HttpResponse(null));
    }
}

Как я могу сделать то же самое при установке значений типа Request.Form (с возможностью сохранения строки запроса тоже)?

Ответы [ 2 ]

2 голосов
/ 02 февраля 2011

Этот пост содержит ответ - stackoverflow: можно ли изменить значение значения POST без повторной отправки?

protected void SetFormValue(string key, string value)
{
    var collection = HttpContext.Current.Request.Form;

    // Get the "IsReadOnly" protected instance property. 
    var propInfo = collection.GetType().GetProperty("IsReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);

    // Mark the collection as NOT "IsReadOnly" 
    propInfo.SetValue(collection, false, new object[] { });

    // Change the value of the key. 
    collection[key] = value;

    // Mark the collection back as "IsReadOnly" 
    propInfo.SetValue(collection, true, new object[] { });
} 
1 голос
/ 01 февраля 2011

Вы можете вызвать internal SwitchForm(NameValueCollection) с помощью Reflection и заключить его в метод расширения:

public static void SetForm(this HttpRequest request, NameValueCollection collection)
{
    typeof(HttpRequest).GetMethod(
        "SwitchForm",
        BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.InvokeMethod
        ).Invoke(
            request ?? HttpContext.Current.Request,
            new[]
            {
                collection ?? new NameValueCollection { { "name", "value" } }
            });
}
...