如何在C#中复制此JavaScript

How do I duplicate this JavaScript in C#

本文关键字:复制 JavaScript      更新时间:2023-09-26

这是JavaScript

function ChangeVol(id)
{
    document.form.selectFS_devId.value = id;
    document.form.selectFS_currentNameSpace.value = "";
    document.form.submit();
}
function ChangeEvsVol(id, vNodeId)
{
    document.form.selectFS_evsId.value = vNodeId;
    document.form.selectFS_currentNameSpace.value = "";
    ChangeVol(id);
}
document.form.selectFS_devId.value = "all"  
document.form.selectFS_evsId.value = "2"

这是我使用的当前C#代码

Uri url = new Uri("https://mgr/app");
HttpWebRequest request = null;
ServicePointManager.ServerCertificateValidationCallback =
   ((sender, certificate, chain, sslPolicyErrors) => true);
CookieContainer cookieJar = new CookieContainer();
request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = cookieJar;
request.Method = "GET";
HttpStatusCode responseStatus;
using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
     responseStatus = response.StatusCode;
     url = request.Address;
}
if (responseStatus == HttpStatusCode.OK)
{
      UriBuilder urlBuilder = new UriBuilder(url);
      urlBuilder.Path = 
          urlBuilder.Path.Remove(urlBuilder.Path.LastIndexOf('/')) + 
          "/j_security_check";
      request = (HttpWebRequest)WebRequest.Create(urlBuilder.ToString());
      request.Referer = url.ToString();
      request.CookieContainer = cookieJar;
      request.Method = "POST";
      request.ContentType = "application/x-www-form-urlencoded";
      using (Stream requestStream = request.GetRequestStream())
      using (StreamWriter requestWriter = new StreamWriter(requestStream, Encoding.ASCII))
      {
           string postData = "j_username=user&j_password=user&submit=Send";
           requestWriter.Write(postData);
      }
      string responseContent = null;
      string myTargetString = "https://mgr/app/action/storage.VivolAction/eventsubmit_dopreparevivollist/ignored/f5/true";
      using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
      using (Stream responseStream = response.GetResponseStream())
      using (StreamReader responseReader = new StreamReader(responseStream))
      {
         responseContent = responseReader.ReadToEnd();
      }
      Console.WriteLine(responseContent);
      request = (HttpWebRequest)WebRequest.Create(myTargetString);
      request.Method = "GET";
      request.CookieContainer = cookieJar;
      using (HttpWebResponse responsedownload = (HttpWebResponse)request.GetResponse())
      using (Stream responseStream = responsedownload.GetResponseStream())
      using (StreamReader responseReader = new StreamReader(responseStream))
      {
            responseContent = responseReader.ReadToEnd();
      }
      Console.WriteLine(responseContent);

问题是字符串myTargetString没有加载javascript参数,如果我能在URL中复制这些参数,那就太棒了,如果不能,我需要做什么才能像上面在StreamWriter中那样在帖子请求中提交这些参数?

using (StreamWriter requestWriter = new StreamWriter(requestStream, Encoding.ASCII))
            {
                string postData = "j_username=user&j_password=user&submit=Send";
                requestWriter.Write(postData);
            }

我在url中所说的可能是这样的:

https://mgr/app/action/storage.VivolAction/eventsubmit_dopreparevivollist/ignored?&evsId=1&devId=all&currentpagenumberbottom=1&filtername=&currentpagenumber=1&quotaactionlink=/mgr/app/action/storage.VivolQuotaAction&ascending=true&currentpagesize=20&ignoreErrorMessages=true&pageindex=1&sortby=name&filterpath=

Fiddler给我提供了这个

POST https://mgr/app/action/storage.SelectFileSystemAction/eventsubmit_doprocessselectfilesystem/ignored  
Accept: image/gif, image/jpeg, image/pjpeg, image/pjpeg, application/x-shockwave-flash,   application/xaml+xml, application/x-ms-xbap, application/x-ms-application,   application/vnd.ms-xpsdocument, application/vnd.ms-excel, application/vnd.ms-powerpoint,   application/msword, */*  
Referer: https://mgr/app/action/storage.SelectFileSystemAction  /eventsubmit_doprepareselectfilesystem/ignored  
Accept-Language: en-us  
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0)  
Content-Type: application/x-www-form-urlencoded  
Accept-Encoding: gzip, deflate  
Host: arc  
Content-Length: 378  
Connection: Keep-Alive  
Cache-Control: no-cache  
Cookie: jid=asdsad ; jsso = asdas2sa    
op=&selectFS_devId=all&selectFS_previous_template=&selectFS_evsId=2&selectFS_currentNameSpace=&selectFS_action_class=storage.VivolAction&selectFS_action_method=doPreparevivollist&selectFS_uniqueId=13655b454e3951462f&selectFS_dont_alter_current=false&selectFS_disableReplicationTargets=true&selectFS_disableReadCache=true&selectFS_disableWorm=false&selectFS_disableUnmounted=true

我可以在那里看到electFS_devId=allselectFS_evsId=2,我需要更改EVSID,但我不知道如何构造URL。是的,我更改了cookie id的

您的javascript只是在执行提交之前为表单上可能隐藏的字段设置表单值。您将需要执行POST请求,与登录相同。

查看HTML中表单标记上的操作值,以确定在哪里提交数据,并将以下表单项放入postData:

  1. 选择FS_devId
  2. 选择FS_currentNameSpace
  3. selectFS_evsId

你可以使用类似的东西:

string postData = string.Format("selectFS_currentNameSpace={0}&selectFS_evsId={1}&selectFS_devId={2}", "", "2", "all");

看起来这会涉及到,因为它似乎正在使用selectFS_uniqueId进行某种形式的会话或事务跟踪,您可能必须先执行get操作,然后从表单中提取该值。此外,请注意,您的提交位置,就像之前的j_security_check一样,POST(doprocess)与检索表单的GET(doprepare)不会到达相同的位置。

得到https://mgr/app/action/storage.SelectFileSystemAction/eventsubmit_doprepareselectfilesystem/ignored

岗位https://mgr/app/action/storage.SelectFileSystemAction/eventsubmit_doprocessselectfilesystem/ignored

再来看看你的帖子价值观。显然,有一个命令是用类(selectFS_action_class)和方法(selectFS_action_method)发出的,如果没有指定它们,很可能什么都不会做。

op=
&selectFS_devId=all
&selectFS_previous_template=
&selectFS_evsId=2
&selectFS_currentNameSpace=
&selectFS_action_class=storage.VivolAction
&selectFS_action_method=doPreparevivollist
&selectFS_uniqueId=13655b454e3951462f
&selectFS_dont_alter_current=false
&selectFS_disableReplicationTargets=true
&selectFS_disableReadCache=true
&selectFS_disableWorm=false
&selectFS_disableUnmounted=true

与其写所有这些东西来模拟用户通过web界面执行操作,不如用F5检查一下他们是否有可以调用的web服务?

也许问题是,这种形式的参数"j_username=user&j_password=user&submit=Send"是HTTP"GET"的参数,而不是"POST"的参数。您可以尝试通过这种方式获取参数。C#

var operacion = context.Request.Form[0] "POST"
var operacion = context.Request.Params[0];

Request.Querystring("parameterName") for "GET"

或者在javascript中,您可以使用$_GET或$_POST

我认为你的问题太多了。另外,你没有在浏览器中显示任何关于帖子的代码。

你似乎只是想知道如何让一个表单帖子工作。。。我注意到你没有设置contentlength属性。。。这可能与此有关。此外,请查看此"帖子"。。。

如何在C#中使用WebClient将数据发布到特定的URL