2012-06-22 3 views
1

Я пытаюсь настроить прокси-сервер, который мы публикуем на моем прокси-сервере. Прокси-сервер выведет опубликованные данные на сервер и получит ответ от фактического сервера. Затем отобразите ответ на прокси-сервере, который веб-сайт, который сделал запрос, читает и делает что-либо с данными. У меня возникли проблемы с первой частью получения исходных данных, поступающих с веб-сайта. Кажется, файл asmx всегда хочет что-то делать с параметрами, но мой прокси-сервер просто хочет передать необработанный запрос. Он не знает параметров. Ниже приведен пример запроса на прокси-сервер: localhost/mobile.asmx POST {"userName": "[email protected]", "password": "xxxx", "appID": "2302FF64-925D-4E0E -B086-73AA9FF152D8 "}C# .net доступ к исходному запросу json в службе asmx

Еще раз я не хочу просто вводить имя пользователя и пароль. Я хочу захватить полный необработанный запрос и отправить его на реальный сервер.

Я пробовал множество вещей. Поскольку параметр запроса отсутствует, я не могу использовать запрос. Я также считаю, что функция GETUSERTOKENLOGIN происходит после чтения потока исходных данных, поэтому я больше не могу использовать поток для получения данных. Я попробовал немало вещей.

Я хочу, чтобы это был супер простой сценарий, если это возможно. Ниже мой супер простой пример. Я знаю, что могу просто добавить обертку вокруг данных, но я бы не хотел этого делать.

Любая помощь была бы принята с благодарностью. MOBILE.ASMX

<%@ WebService Language="C#" Class="mobile" %> 

using System; 
using System.Collections; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.Web; 
using System.Web.Services; 
using System.Net; 
using System.IO; 
using System.Web.Script.Services; 
using System.Text; 
[WebServiceBinding(ConformsTo = WsiProfiles.None)] 
// To allow this Web Service to be called from script, using ASP.NET AJAX, uncomment the following line. 
[System.Web.Script.Services.ScriptService] 
public class mobile : System.Web.Services.WebService 
{ 
    public mobile() 
    { 


    } 

    // The HelloWorld() example service returns the string Hello World. 
    [WebMethod] 
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
    public string GetUserTokenLogin() 
    { 
     // Create a new request to the mentioned URL. 
     WebRequest myWebRequest = WebRequest.Create("http://api.geonames.org/citiesJSON"); 
     myWebRequest.Method = "POST"; 
     Stream dataStream = myWebRequest.GetRequestStream(); 
     WebResponse myWebResponse = myWebRequest.GetResponse(); 

     // Print the HTML contents of the page to the console. 
     Stream streamResponse = myWebResponse.GetResponseStream(); 
     StreamReader streamRead = new StreamReader(streamResponse); 
     Char[] readBuff = new Char[256]; 
     int count = streamRead.Read(readBuff, 0, 256); 
     String FullData = ""; 
     while (count > 0) 
     { 
      String outputData = new String(readBuff, 0, count); 
      FullData = FullData + outputData; 
      count = streamRead.Read(readBuff, 0, 256); 
     } 

     // Close the Stream object. 
     streamResponse.Close(); 
     streamRead.Close(); 

     myWebResponse.Close(); 
     return FullData; 
    } 
} 

ответ

0

Синтаксический запрос является работа сервера приложений.

Ваш прокси-сервер не должен иметь на нем никакого кода приложения. Если все, что вы хотите сделать, это использовать IIS в качестве прокси-сервера, см.: Setting up IIS as a reverse proxy.

Если вы хотите получить необработанный запрос и хотите выписать свой необработанный ответ, вы можете создать пользовательский HttpModule.

См: Creating a custom HttpModule

В этом модуле вы можете получить запрос, как клиент послал его, и направить его на другой сервер, а затем принять ответ от этого сервера и направить его к вашему клиенту. (Фактически вы делаете обратный прокси.)

Невозможно достичь этого в веб-сервисе asp.net.

+0

Есть ли способ получить исходное сообщение из файла asmx? Я просто создаю файл. Я бы предпочел, чтобы мой клиент не должен был проходить через всю эту конфигурацию. Можно ли получить исходную почту в службу, чтобы я мог отправить ее на сервер. Если бы я просто мог это сделать, тогда у меня был бы хороший сценарий. –

+0

Я отредактировал свой ответ, необработанные сообщения вам нужно реализовать 'IHttpModule'. Взглянуть. – nunespascal

+0

Спасибо. За ваше время. Я нашел это решение очень полезным: http://www.codeproject.com/Articles/31329/Simple-Reverse-Proxy-in-C-2-0-description-and-depl Все, что мне нужно было сделать, это скачать демо, которая дает вам dll и webconfig. Я поставлю более точную информацию в моем первоначальном вопросе. благодаря –

0

Я закончил загрузку демо снизу: http://www.codeproject.com/Articles/31329/Simple-Reverse-Proxy-in-C-2-0-description-and-depl Он дает вам папку с бинами, которую я только что положил в свой корневой каталог. Затем я создал папку под названием mobile.asmx. В этой папке я поставил WebConfig из демки в нем только с изменением удаленного сервера

<appSettings> 
<add key="RemoteWebSite" value="http://my-clients-server.com/mobile_dev/" /> 
</appSettings> 

<system.web> 
    <httpHandlers> 
    <add verb="*" path="*" type="ReverseProxy.ReverseProxy, ReverseProxy"/> 
</httpHandlers> 
</system.web> 

Поэтому, когда веб-сайт запрашивает текущий домен, например: www.currentdomain.com/mobile.asmx/MYSERVICE It вперед по этой просьбе на удаленном веб-сайте, как показано ниже: http://my-clients-server.com/mobile_dev/mobile.asmx/MYSERVICE

Я протестировал вышеуказанное как с XML, так и с JSON, которые мне были нужны.

0

Чтобы получить необработанный JSON из запроса в вашем ASMX (например, вы сделали запрос POST к нему из AngularJS), попробуйте следующий код:

[WebMethod] 
[ScriptMethod(ResponseFormat = ResponseFormat.Json)] 
public string Calculate() 
{ 
    HttpContext.Current.Request.InputStream.Position = 0; 
    var jsonString = new StreamReader(HttpContext.Current.Request.InputStream, Encoding.UTF8).ReadToEnd(); 
    var json = JObject.Parse(jsonString); 

    // your code 
} 

Обратите внимание, что вы не должны a using заявление здесь, так как вы не тот, кто распоряжается InputStream.

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