1

データをプロキシサーバーに送信する単純なプロキシサーバーをセットアップしようとしています。プロキシサーバーは、投稿されたデータを実際のサーバーに転送し、実際のサーバーから応答を取得します。次に、リクエストを行ったWebサイトが読み取り、データを処理するプロキシサーバーに応答を表示します。ウェブサイトからの生の投稿データを取得する最初の部分で問題が発生しています。asmxファイルは常にパラメーターから処理を実行したいようですが、私のプロキシは生の要求を転送したいだけです。パラメータを知りません。以下は、プロキシサーバーへのリクエストの例です。localhost/ mobile.asmx POST {"userName": "fake@email.com"、 "password": "xxxx"、 "appID": "2302FF64-925D-4E0E-B086- 73AA9FF152D8 "}

もう一度、ユーザー名とパスワードだけを取得したくありません。完全なrawリクエストをキャプチャして、実サーバーに転送したいと思います。

私はたくさんのことを試しました。リクエストパラメータがないため、リクエストを使用できません。また、生の投稿データのストリームが読み取られた後に関数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;
    }
}
4

3 に答える 3

2

ASMXでリクエストの生のJSONを取得するには(たとえば、AngularJSからリクエストのPOSTリクエストを作成した場合)、次のコードを試してください。

[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
}

usingを破棄するのはあなたではないため、ここでステートメントは必要ないことに注意してくださいInputStream

于 2017-12-04T01:03:30.530 に答える
0

リクエストの解析は、アプリケーションサーバーの仕事です。

プロキシサーバーには、アプリケーションコードが含まれていてはなりません。IISをプロキシサーバーとして使用するだけの場合は、IISをリバースプロキシとして設定するを参照してください。

生のリクエストのみが必要で、生の応答を書き出す場合は、カスタムを作成できますHttpModule

参照:カスタムHttpModuleの作成

このモジュールでは、クライアントがリクエストを送信したときにリクエストを取得し、それを別のサーバーに転送してから、そのサーバーからの応答を取得してクライアントに転送できます。(実際には、リバースプロキシを作成しています。)

asp.netWebサービス内でこれを実現する方法はありません。

于 2012-06-22T20:33:34.657 に答える
0

私は下からデモをダウンロードすることになりました:http://www.codeproject.com/Articles/31329/Simple-Reverse-Proxy-in-C-2-0-description-and-deplそれはあなたに私があなたにbinフォルダーを与えますルートディレクトリに置くだけです。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>

したがって、Webサイトが現在のドメインを要求するたびに、たとえば次のようになります。www.currentdomain.com/mobile.asmx/MYSERVICEその要求に応じて、次のようにリモートWebサイトに転送します: http://my-clients-server.com/mobile_dev/mobile 。 asmx / MYSERVICE

上記を必要なXMLとJSONの両方でテストしました。

于 2013-04-06T03:08:56.663 に答える