Могу ли я вызвать функцию javascript (из классического ASP) из моего кода ASP.NET и получить ее результат? - PullRequest
1 голос
/ 01 февраля 2011

Из того, что я видел в SO и других местах, IIS может запускать код Javascript на стороне сервера, используя его движок JScript.На самом деле, в Classic ASP довольно легко заставить это работать, поскольку VBScript может вызывать эти функции напрямую.Тем не менее, в .NET, я не уверен, как действовать.

Я конвертирую веб-приложение, написанное на Classic ASP, в .NET.Приложение использует функцию javascript для хеширования пароля пользователя.Результат запрашивается по хешам, хранящимся в базе данных.

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

Многое из того, что я видел в Интернете, связано с вызовом javascript с использованием функции RegisterStartupScript, которая в данном случае не работает, поскольку я хочу, чтобы javascript запускался на сервере, и я хочу получить результатJavascript, прежде чем я отправлю обратно.Это возможно?

Ответы [ 4 ]

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

Да и нет.

Вы можете вызвать метод javascript через серверную часть ASP.NET, но единственный способ получить результат - отправить его обратно через AJAX

чтобы вы могли начать вызов, а затем подождать, пока результат не вернется, и обработать результат.

Это может или не может быть то, что вы хотите.

Чтобы ответить на ваш вопрос напрямую, перепишите функцию хеширования в коде C # и вызовите ее там. Не просто портируйте устаревший код, улучшайте его.

1 голос
/ 03 февраля 2011

Лучше всего было бы не бояться хэш-функции.Если вы можете понять алгоритм и переопределить его в C #.Придумайте несколько тестовых примеров, чтобы убедиться, что вы получаете одинаковые результаты в обоих случаях.В конце концов, это сэкономит вам много усилий.

Поскольку классический ASP анализирует страницы постранично, вы можете выбирать, на каком языке вы написали свои страницы. Вы можете использовать любойязык activescript (perl был доступен таким образом в один момент!)

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

Саймон

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

Вот способ обернуть функцию JScript на стороне сервера с помощью простого локального вызова «веб-службы».

Добавить сценарий JScript или ASP, который ссылается на функцию хеширования:

Файл: DoHash.asp

<!-- #include file="passwordHasher.js" -->
<%
Dim password
password = Request.Form("password")
Response.Write HashPassword(password)

%>

В вашем приложении ASP.NET добавьте этот метод (и класс, если необходимо, где-то уместно:

public class HashWrapper
{
    public static string HashPasswordFromJScript(string password)
    {
      string url = "https://mysite.com/DoHash.asp";

      string fields = "password=" + password;
      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
      request.ContentType = "application/x-www-form-urlencoded";
      request.Method = "POST";

      using(Stream rs = request.GetRequestStream())
      {
        using (MemoryStream ms = new MemoryStream())
        {
          using(BinaryWriter bw = new BinaryWriter(ms))
          {
            bw.Write(Encoding.UTF8.GetBytes(fields));
            ms.WriteTo(rs);
            ms.Flush();
          }
        }
      }

      using(HttpWebResponse response = (HttpWebResponse)request.GetResponse())
      {
        if(response.StatusCode == HttpStatusCode.OK)
        {
          using(Stream rs = response.GetResponseStream())
          {
            using (StreamReader rr = new StreamReader(rs))
            {
              StringBuilder sb = new StringBuilder();
              int bufferSize = 1024;
              char[] read = new Char[bufferSize];
              int count = rr.Read(read, 0, bufferSize);

              while (count > 0)
              {
                sb.Append(read, 0, count);
                count = rr.Read(read, 0, bufferSize);
              }
              return sb.ToString();
            }
          }
        }
        return null;
      }
    }
}

В части приложения вам нужно просто хэшировать парользвоните:

string hashedPassword = HashWrapper.HashPasswordFromJScript(password);

Это не красиво, но поможет вам. Я также предполагаю, что ваш сайт может шифровать трафик с помощью SSL.

0 голосов
/ 01 февраля 2011

Попробуйте использовать JavaScript для обработки поведения на стороне клиента и позволить VB / C # обрабатывать вызовы на стороне сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...