none
Пост на удаленный сервер из серверного кода codebehind RRS feed

  • Вопрос

  • Необходимо дать ответ на удаленный сервер в виде поста с определенными параметрами без форм и submit кнопок, т.е. внутри метода.

    На PHP выглядит это примерно так:

    #!/usr/bin/php
    <?php
    function print_answer($result, $description)
    {
        print "WMI_RESULT=" . strtoupper($result) . "&";
        print "WMI_DESCRIPTION=" .urlencode($description);
        exit();
    }?>

    Подскажите, пожалуйста, как это правильно делается на ASP .NET ?


    • Изменено Kutcher 5 ноября 2012 г. 0:09 неточность
    5 ноября 2012 г. 0:00

Ответы

  • Во примерно то что Вы хотите, просто я делаю POST из консольного приложения контроллеру, а Вам нужно из кода ASP.NET на другой сервер. Вам только адреса надо поменять.

    namespace ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:29236/home/test");
                request.Method = "POST";
                string formData = "WMI_RESULT=OK&WMI_DESCRIPTION=Сервер временно недоступен";
                byte[] byteArray = Encoding.UTF8.GetBytes(formData);
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = byteArray.Length;
                Stream dataStream = request.GetRequestStream();
                dataStream.Write(byteArray, 0, byteArray.Length);
                dataStream.Close();
                WebResponse response = request.GetResponse();
                dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream);
                string responseFromServer = HttpUtility.UrlDecode(reader.ReadToEnd());
                reader.Close();
                dataStream.Close();
                response.Close();
            }
        }
    }

    • Предложено в качестве ответа rudevelop 6 ноября 2012 г. 9:17
    • Отменено предложение в качестве ответа rudevelop 6 ноября 2012 г. 9:17
    • Помечено в качестве ответа Kutcher 6 ноября 2012 г. 17:54
    6 ноября 2012 г. 6:16
    Модератор
    • Помечено в качестве ответа Kutcher 6 ноября 2012 г. 17:54
    6 ноября 2012 г. 9:18

Все ответы

  • Нашел класс, который использует характерый для большинства примеров способ,  но он опять таки генерирует форму с кнопкой сабмит, неужели нет способа постить данные без формы?

    public class  RemotePost{
         private  System.Collections.Specialized.NameValueCollection Inputs 
         = new  System.Collections.Specialized.NameValueCollection() ;
    
        public string  Url  =  "" ;
        public string  Method  =  "post" ;
        public string  FormName  =  "form1" ;
        
        public void  Add( string  name, string value ){
            Inputs.Add(name, value ) ;
         }
        
         public void  Post(){
            System.Web.HttpContext.Current.Response.Clear() ;
            
             System.Web.HttpContext.Current.Response.Write( "<html><head>" ) ;
            
             System.Web.HttpContext.Current.Response.Write( string .Format( "</head><body onload=\"document.{0}.submit()\">" ,FormName)) ;
            
             System.Web.HttpContext.Current.Response.Write( string .Format( "<form name=\"{0}\" method=\"{1}\" action=\"{2}\" >" ,
            
            FormName,Method,Url)) ;
                for ( int  i = 0 ; i< Inputs.Keys.Count ; i++){
                System.Web.HttpContext.Current.Response.Write( string .Format( "<input name=\"{0}\" type=\"hidden\" value=\"{1}\">" ,Inputs.Keys[i],Inputs[Inputs.Keys[i]])) ;
             }
            System.Web.HttpContext.Current.Response.Write( "</form>" ) ;
             System.Web.HttpContext.Current.Response.Write( "</body></html>" ) ;
             System.Web.HttpContext.Current.Response.End() ;
         }
    }

    5 ноября 2012 г. 0:28
  • Более подробно можете написать, что нужно и куда отправить?
    5 ноября 2012 г. 5:28
    Модератор
  • Необходимо дать ответ после оплаты в систему электронных платежей "Единая касса", позже необходимо подключить еще несколько систем оплаты.

    Пост при оплате выполняется у меня из формы по кнопке сабмит причем автоматически через javaScript, но это неважно, т.к. тут проблем нет.

    После оплаты, необходимо вернуть статус платежа.

    http://merchant.w1.ru/checkout/site/develope/?lang=ru-RU#step5

    Вот разъяснение со  страницы Единой кассы:

    Интернет-магазин должен обработать запрос оповещения о результате оплаты и вернуть ответ. Обработка запроса для интернет-магазина происходит также, как будто он получил POST-запрос от обычной HTML-формы, только вместо страницы он должен вернуть строку следующего содержания:

    1 WMI_RESULT=OK

    или

    1 WMI_RESULT=RETRY&WMI_DESCRIPTION=Сервер временно недоступен

    Парметр WMI_RESULT в ответе интернет-магазина должен содержать результат обработки запроса и может принимать одно из следующих значений:

    •  OK  — все в порядке, интернет-магазин обработал уведомление и принял заказ.
    •  RETRY  — интернет-магазин не может в данный момент обработать уведомление. Единая касса повторит запрос позже.

    Парметр WMI_DESCRIPTION в ответе интернет-магазина может содержать комментарий, который будет сохранен в логах Единой кассы. Рекомендуется возвращать его в случае ошибки. Значение данного параметра должно быть в кодировке UrlEncode:

    На данный момент моя страница обработки запросов читает входящие параметры, изменяет бд необходимым образом и теперь необходимо послать ответ. Как это сделать?

    5 ноября 2012 г. 14:47
  • Все что мне нужно это правильно прочесть данные от сервиса оплаты и сразу же (программно, без форм и сабмитов) отправить уже другие данные обратно сервису. Я уже голову сломал, что-то не то делаю.

    У меня есть страница для приема входящих параметров, уже не уверен правильно ли я все делаю, но считываю я их так:

    	public string GetRequestValue(string ParamName)
    	{
    		string res = "";
    
    		if (Request.Form.Get(ParamName) != null)
    		{
    			res = (Request.Form.Get(ParamName));
    		}
    
    		return res;
    	}
    
    	protected void Page_Load(object sender, EventArgs e)
    	{
    		string param = Request.Form.Get("WMI_PAYMENT_NO");
    		string param1 = Request.Form.Get("WMI_DESCRIPTION");
    
    		string ProcessingName="W1"; 
    		string PaySum=GetRequestValue("WMI_PAYMENT_AMOUNT");
    		string ShopOrderID=GetRequestValue("WMI_PAYMENT_NO");
    		string ElectronPayOrderID = GetRequestValue("WMI_ORDER_ID");
    		string Currency = GetRequestValue("WMI_CURRENCY_ID");
    		string OrderState=GetRequestValue("WMI_ORDER_STATE");
    		string ToUserID=GetRequestValue("WMI_TO_USER_ID");
    		string CreateDate=GetRequestValue("WMI_CREATE_DATE");
    		string ExpiredDate=GetRequestValue("WMI_EXPIRED_DATE");
    		string UpdateDate=GetRequestValue(" WMI_UPDATE_DATE");
    		string Signature = GetRequestValue("WMI_SIGNATURE");
    
     

    Далее проверяю и если все нормально, то я обязан отправить обратно на сервис POST запрос с ответом, что-то вроде

            NameValueCollection Col = new NameValueCollection();
            Col.Add("WMI_RESULT", "OK"); 
    
    
            string response = WebPostUtils.PostDataToUrl("eshop.ru", Col);

    Так вот как сделать этот пост из программного метода?



    5 ноября 2012 г. 18:11
  • Во примерно то что Вы хотите, просто я делаю POST из консольного приложения контроллеру, а Вам нужно из кода ASP.NET на другой сервер. Вам только адреса надо поменять.

    namespace ConsoleApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:29236/home/test");
                request.Method = "POST";
                string formData = "WMI_RESULT=OK&WMI_DESCRIPTION=Сервер временно недоступен";
                byte[] byteArray = Encoding.UTF8.GetBytes(formData);
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = byteArray.Length;
                Stream dataStream = request.GetRequestStream();
                dataStream.Write(byteArray, 0, byteArray.Length);
                dataStream.Close();
                WebResponse response = request.GetResponse();
                dataStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(dataStream);
                string responseFromServer = HttpUtility.UrlDecode(reader.ReadToEnd());
                reader.Close();
                dataStream.Close();
                response.Close();
            }
        }
    }

    • Предложено в качестве ответа rudevelop 6 ноября 2012 г. 9:17
    • Отменено предложение в качестве ответа rudevelop 6 ноября 2012 г. 9:17
    • Помечено в качестве ответа Kutcher 6 ноября 2012 г. 17:54
    6 ноября 2012 г. 6:16
    Модератор
    • Помечено в качестве ответа Kutcher 6 ноября 2012 г. 17:54
    6 ноября 2012 г. 9:18
  • Спасибо, будем пробовать.

    6 ноября 2012 г. 14:33