2015-10-18 3 views
1

Я пытаюсь получить доступ к параметру строки запроса, который был отправлен с использованием метода POST (WebClient) в веб-API в ASP.NET MVC 5 (в переопределенном атрибуте AuthorizationFilterAttribute).Доступ к строковым переменным запроса, отправленным как POST в HttpActionContext

Для Get, я использовал следующий трюк: var param= actionContext.Request.GetQueryNameValuePairs().SingleOrDefault(x => x.Key.Equals("param")).Value;

Однако после того, как я использую POST, это делает работу, а переменная Фарана устанавливается в нуль. Я думаю, это потому, что метод строки запроса применяется только к URL-адресу, а не к телу. Есть ли способ получить строку запроса (желательно с использованием одного метода) для запросов GET и POST?

EDIT: WebClient код

using (WebClient client = new WebClient()) 
{ 
     NameValueCollection reqparm = new NameValueCollection(); 

     reqparm.Add("param", param); 

     byte[] responsebytes = client.UploadValues("https://localhost:44300/api/method/", "POST", reqparm); 
     string responsebody = Encoding.UTF8.GetString(responsebytes); 

     return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(responsebody); 

    } 
} 
+1

Вы, кажется, исходите из фона PHP. Вопреки тому, что этот язык заставляет вас поверить ('$ _GET'), глагол, используемый для запроса страницы, вовсе не связан с строкой запроса. Это просто: часть после '?' В запросе-URI. Покажите код WebClient, который вы используете для отправки запроса POST; Повсюду вы не устанавливаете правильные параметры строки запроса. – CodeCaster

+0

@CodeCaster, я думаю, что это просто веб-API, который создает проблемы. В любом другом случае либо Request ["name"] (как и в PHP :)), либо указав параметр в сигнатуре метода, будет (как для GET, так и для POST). Для Web API это кажется более сложным. – Artem

+0

Нет, это не так. 'actionContext.Request.GetQueryNameValuePairs()' даст вам параметры из строки запроса, независимо от того, какой глагол запросил текущий метод действия. Покажите свой код WebClient. – CodeCaster

ответ

1

Использование кода вы показываете, вы загрузите param=value в теле запроса, используя application/x-www-form-urlencoded тип содержимого.

Если вы хотите использовать строку запроса, вам необходимо установить его отдельно, используя WebClient.QueryString property:

// Query string parameters 
NameValueCollection queryStringParameters = new NameValueCollection(); 
queryStringParameters.Add("someOtherParam", "foo"); 
client.QueryString = queryStringParameters; 

// Request body parameters 
NameValueCollection requestParameters = new NameValueCollection(); 
requestParameters.Add("param", param); 

client.UploadValues(uri, method, requestParameters); 

Это сделает запрос пойти uri?someOtherParam=foo, что позволяет прочитать строку запроса параметров ServerSide через actionContext.Request.GetQueryNameValuePairs().

+0

Есть ли способ прочитать параметры тела запроса с помощью методов, доступных в веб-API (на стороне сервера)? – Artem

+1

@Artem 'await Request.Content.ReadAsFormDataAsync()', который даст вам еще один 'NameValueCollection'. – CodeCaster

+0

Спасибо за ваш ответ! :) +1 – Artem

Смежные вопросы