0

69行目で、「ArgumentOutOfRangeExceptionが処理されませんでした」というエラーが発生します。

/*
Please critique as I'm always looking for ways to improve my coding.

Usage Example:
MapleWebStart mws = new MapleWebStart("myusername", "mypassword");
mws.Start();
*/

using System;
using System.Diagnostics;
using System.IO;
using System.Net;
using System.Text;
using Microsoft.Win32;

public class MapleWebStart
{
    private CookieContainer LoginCookie;

    public MapleWebStart(string username, string password)
    {
        LoginCookie = new CookieContainer();
        if (!Login(username, password))
            throw new ArgumentException("Invalid Nexon username or password.");
    }

    public MapleWebStart(CookieContainer loginCookie)
    {
        LoginCookie = loginCookie;
    }

    private bool Login(string username, string password)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://maplestory.nexon.net/Controls/Passport.aspx");
        request.Method = "POST";
        string postData = "__VIEWSTATE=%2FwEPDwULLTE5NjM3MjM3MDcPZBYCAgMPZBYEAgUPFgIeB1Zpc2libGVoZAIHDxYCHwBoZGSVGoua1TAiCeQWNk%2BdqOF%2FXtq%2BmA%3D%3D&tbID=" + username + "&" + "tbPass=" + password;
        byte[] byteArray = Encoding.UTF8.GetBytes(postData);
        request.CookieContainer = LoginCookie;
        request.ContentType = "application/x-www-form-urlencoded";
        request.ContentLength = byteArray.Length;
        Stream dataStream = request.GetRequestStream();
        dataStream.Write(byteArray, 0, byteArray.Length);
        dataStream.Close();
        HttpWebResponse response = (HttpWebResponse)request.GetResponse();
        dataStream = response.GetResponseStream();
        StreamReader reader = new StreamReader(dataStream);
        string responseFromServer = reader.ReadToEnd();
        reader.Close();
        dataStream.Close();
        response.Close();
        if (!responseFromServer.Contains("Wrong password"))
        {
            LoginCookie.Add(response.Cookies);
            return true;
        }
        return false;
    }

    private string GetMaplePath()
    {
        string maplePath = (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Wizet\MapleStory", "ExecPath", "");
        return File.Exists(maplePath) ? maplePath : (string)Registry.GetValue(@"HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Wizet\MapleStory", "ExecPath", "");
    }

    public void Start()
    {
        ProcessStartInfo maplestory = new ProcessStartInfo();
        maplestory.FileName = GetMaplePath() + @"\MapleStory.exe";
        maplestory.Arguments = "WebStart " + LoginCookie.GetCookies(new Uri("http://nexon.net"))[0].ToString().Substring(4);
        Process.Start(maplestory);
    }

元のコード: http: //pastie.org/private/vgpxht8tehtdjml2jdq

4

1 に答える 1

1

あなたの問題はそれです

LoginCookie.GetCookies(new Uri("http://nexon.net"))[0].ToString()

5 文字未満の文字列を返します。だから、やって

LoginCookie.GetCookies(new Uri("http://nexon.net"))[0].ToString().Substring(4)

位置 4 に文字がないため、失敗します。処理する前に文字列の長さを確認する必要があります。

于 2012-08-08T15:38:09.997 に答える