错误:流不支持并发IO读取或写入操作 [英] error: The stream does not support concurrent IO read or write operations
问题描述
我尝试从我的C#网络应用程序登录网站,直接从应用程序发送电子邮件,而不是让用户亲自访问网站。
注意:网站,我试图登录更改 id
的文本框
每次加载页面,即使在相同的会议。因此,我决定读取页面源代码,提取文本框的 id
,然后在发布消息时使用 id
。
public partial class sender:System.Web.UI.Page
{
字符串userID,userPwd,recepsID,msgText,loginResponseString,sessionCode,queryCode;
private HttpWebRequest initRequest,loginRequest,msgRequest;
private HttpWebResponse initResponse,loginResponse;
private Object lockObj = new Object();
protected void Page_Load(object sender,EventArgs e)
{
userID = Request.QueryString [userNumber];
userPwd = Request.QueryString [userPwd];
recepsID = Request.QueryString [receps];
msgText = Request.QueryString [msgBody];
if(userID!= null&& userPwd!= null&& recepsID!= null& msgText!= null)
doLoginAndSendMessage(userID,userPwd,recepsID,msgText);
else
Response.Write(Some values are missing);
}
public void doLoginAndSendMessage(string uid,string pwd,string recepIds,string msg)
{
try
{
doLogin uid,pwd,recepIds,msg);
}
catch(Exception ex)
{
Response.Write(Sending Failed,Please Try Again);
}
}
public void doLogin(string strUserId,string strPassword,string strIds,string strMessage)
{
try
{
initRequest =(HttpWebRequest)WebRequest.Create(http://www.somewebsite.com/login.aspx);
initRequest.CookieContainer = new CookieContainer();
initRequest.Timeout = 60000;
StreamReader initSr = new StreamReader(initRequest.GetResponse()。GetResponseStream(),System.Text.Encoding.GetEncoding(utf-8));
initSr.ReadToEnd();
initSr.Close();
loginRequest =(HttpWebRequest)WebRequest.Create(http://www.somewebsite.com/login.aspx);
loginRequest.CookieContainer = new CookieContainer();
loginRequest.Timeout = 60000;
StringBuilder loginString = new StringBuilder();
loginString.Append(LoginUserId =+ strUserId +& LoginPassword =+ strPassword +& RememberMe = 1& Login = Login);
byte [] loginData = Encoding.ASCII.GetBytes(loginString.ToString());
//从初始响应中获取任何cookie
initResponse =(HttpWebResponse)initRequest.GetResponse();
//设置cookie
loginRequest.CookieContainer.Add(initResponse.Cookies);
//添加标题
loginRequest.Method =POST;
loginRequest.ContentType =application / x-www-form-urlencoded;
loginRequest.ContentLength = loginData.Length;
Stream loginStream = loginRequest.GetRequestStream();
loginStream.Write(loginData,0,loginData.Length);
loginStream.Close();
//读取响应
StreamReader loginSr = new StreamReader(loginRequest.GetResponse()。GetResponseStream(),System.Text.Encoding.GetEncoding(utf-8));
loginResponseString = loginSr.ReadToEnd();
loginSr.Close();
if(loginResponseString.Contains(inbox.aspx))
{
//获取会话代码
sessionCode = loginResponseString.Substring(125,5);
//调用sendmessage方法
sendMessage(strIds,strMessage);
}
else
{
Response.Write(登录失败:检查用户名和密码);
}
}
catch(Exception ex)
{
Response.Write(Sending Failed,Please Try Again);
}
}
public void sendMessage(string strIds,string strMsg)
{
try
{
string [] ids = strIds.Split(',');
for(int i = 0; i< ids.Length; i ++)
{
msgRequest =(HttpWebRequest)WebRequest.Create(http://www.somewebsite.com/writenew .aspx?sessionid =+ sessionCode);
msgRequest.CookieContainer = new CookieContainer();
msgRequest.Timeout = 1000000;
msgRequest.ReadWriteTimeout = 1000000;
msgRequest.SendChunked = true;
//从初始响应中获取任何Cookie
loginResponse =(HttpWebResponse)loginRequest.GetResponse();
//设置cookie
msgRequest.CookieContainer.Add(loginResponse.Cookies);
//添加标题
msgRequest.Method =POST;
msgRequest.ContentType =application / x-www-form-urlencoded;
流msgStream = msgRequest.GetRequestStream();
流respStream = msgRequest.GetResponse()。GetResponseStream();
StreamReader codeRead = new StreamReader(respStream,System.Text.Encoding.GetEncoding(utf-8));
string temp = codeRead.ReadToEnd();
codeRead.Close();
respStream.Close();
txtResponse.Text = temp;
try
{
int starInd = temp.IndexOf(UserId_);
// int endInd = starInd + 15;
string holder = temp.Substring(starInd,15);
int startInd = holder.IndexOf(_)+ 1;
queryCode = holder.Substring(startInd,5);
txtSubString.Text = queryCode;
}
catch(Exception ex)
{
txtSubString.Text =SOME ERROR;
}
lock(lockObj)
{
StringBuilder msgString = new StringBuilder();
msgString.Append(sessionid =+ queryCode +& GlobalKeyId = 1& MessageLength = 988& ReceiveId_
+ queryCode +=+ ids [i] +& Message_+ queryCode +=+ strMsg
+& SendNow_+ queryCode +=立即发送);
byte [] msgData = Encoding.ASCII.GetBytes(msgString.ToString());
msgStream.Write(msgData,0,msgData.Length);
msgStream.Close();
}
//读取响应
StreamReader msgSr = new StreamReader(respStream,System.Text.Encoding.GetEncoding(utf-8));
string msgResponseString = msgSr.ReadToEnd()?
msgSr.Close();
sessionCode = msgResponseString.Substring(123,5);
}
Response.Write(Message Sent Successfully);
}
catch(Exception ex)
{
Response.Write(Sending Failed,Please Try Again< br />+ ex.Message);
}
}
}
this line
msgStream.Write(msgData,0,msgData.Length);
请帮我解决错误。谢谢 /system.net.httpwebrequest.getresponse.aspxrel =nofollow> GetResponse()
会导致到目前为止建立的请求被发送,
您需要在调用 GetResponse()
之前构建完整的请求,请求不会完成。在调用 GetResponse()
之后获取请求流和写入POST数据将抛出此异常,以表明在已经发送请求之后继续构建请求是没有意义的。 p>
I am trying to log in to a website from my C# web application to send emails directly from the application instead of making user visit the website personally.
NOTE: The website, I am trying to log into changes the id
of the textboxes
everytime the page is loaded, EVEN DURING THE SAME SESSION. Therefore I decided to read the page source, extract the id
of the textbox and then use that id
while posting the message.
public partial class sender : System.Web.UI.Page
{
string userID, userPwd, recepsID, msgText, loginResponseString, sessionCode, queryCode;
private HttpWebRequest initRequest, loginRequest, msgRequest;
private HttpWebResponse initResponse, loginResponse;
private Object lockObj = new Object();
protected void Page_Load(object sender, EventArgs e)
{
userID = Request.QueryString["userNumber"];
userPwd = Request.QueryString["userPwd"];
recepsID = Request.QueryString["receps"];
msgText = Request.QueryString["msgBody"];
if (userID != null && userPwd != null && recepsID != null & msgText != null)
doLoginAndSendMessage(userID, userPwd, recepsID, msgText);
else
Response.Write("Some values are missing");
}
public void doLoginAndSendMessage(string uid, string pwd, string recepIds, string msg)
{
try
{
doLogin(uid, pwd, recepIds, msg);
}
catch (Exception ex)
{
Response.Write("Sending Failed, Please Try Again");
}
}
public void doLogin(string strUserId, string strPassword, string strIds, string strMessage)
{
try
{
initRequest = (HttpWebRequest)WebRequest.Create("http://www.somewebsite.com/login.aspx");
initRequest.CookieContainer = new CookieContainer();
initRequest.Timeout = 60000;
StreamReader initSr = new StreamReader(initRequest.GetResponse().GetResponseStream(), System.Text.Encoding.GetEncoding("utf-8"));
initSr.ReadToEnd();
initSr.Close();
loginRequest = (HttpWebRequest)WebRequest.Create("http://www.somewebsite.com/login.aspx");
loginRequest.CookieContainer = new CookieContainer();
loginRequest.Timeout = 60000;
StringBuilder loginString = new StringBuilder();
loginString.Append("LoginUserId=" + strUserId + "&LoginPassword=" + strPassword + "&RememberMe=1&Login=Login");
byte[] loginData = Encoding.ASCII.GetBytes(loginString.ToString());
//to get any cookies from the initial response
initResponse = (HttpWebResponse)initRequest.GetResponse();
//setting cookies
loginRequest.CookieContainer.Add(initResponse.Cookies);
//Adding Headers
loginRequest.Method = "POST";
loginRequest.ContentType = "application/x-www-form-urlencoded";
loginRequest.ContentLength = loginData.Length;
Stream loginStream = loginRequest.GetRequestStream();
loginStream.Write(loginData, 0, loginData.Length);
loginStream.Close();
//Reading the response
StreamReader loginSr = new StreamReader(loginRequest.GetResponse().GetResponseStream(), System.Text.Encoding.GetEncoding("utf-8"));
loginResponseString = loginSr.ReadToEnd();
loginSr.Close();
if (loginResponseString.Contains("inbox.aspx"))
{
//get session code
sessionCode = loginResponseString.Substring(125, 5);
//call the sendmessage method
sendMessage(strIds, strMessage);
}
else
{
Response.Write("Login Failed: Check Username and password");
}
}
catch (Exception ex)
{
Response.Write("Sending Failed, Please Try Again");
}
}
public void sendMessage(string strIds, string strMsg)
{
try
{
string[] ids = strIds.Split(',');
for (int i = 0; i < ids.Length; i++)
{
msgRequest = (HttpWebRequest)WebRequest.Create("http://www.somewebsite.com/writenew.aspx?sessionid=" + sessionCode);
msgRequest.CookieContainer = new CookieContainer();
msgRequest.Timeout = 1000000;
msgRequest.ReadWriteTimeout = 1000000;
msgRequest.SendChunked = true;
//to get any cookies from the initial response
loginResponse = (HttpWebResponse)loginRequest.GetResponse();
//setting cookies
msgRequest.CookieContainer.Add(loginResponse.Cookies);
//Adding Headers
msgRequest.Method = "POST";
msgRequest.ContentType = "application/x-www-form-urlencoded";
Stream msgStream = msgRequest.GetRequestStream();
Stream respStream = msgRequest.GetResponse().GetResponseStream();
StreamReader codeRead = new StreamReader(respStream, System.Text.Encoding.GetEncoding("utf-8"));
string temp = codeRead.ReadToEnd();
codeRead.Close();
respStream.Close();
txtResponse.Text = temp;
try
{
int starInd = temp.IndexOf("UserId_");
//int endInd = starInd + 15;
string holder = temp.Substring(starInd, 15);
int startInd = holder.IndexOf("_") + 1;
queryCode = holder.Substring(startInd, 5);
txtSubString.Text = queryCode;
}
catch (Exception ex)
{
txtSubString.Text = "SOME ERROR";
}
lock (lockObj)
{
StringBuilder msgString = new StringBuilder();
msgString.Append("sessionid=" + queryCode + "&GlobalKeyId=1&MessageLength=988&ReceiveId_"
+ queryCode + "=" + ids[i] + "&Message_" + queryCode + "=" + strMsg
+ "&SendNow_" + queryCode + "=Send Now");
byte[] msgData = Encoding.ASCII.GetBytes(msgString.ToString());
msgStream.Write(msgData, 0, msgData.Length);
msgStream.Close();
}
//Reading the response
StreamReader msgSr = new StreamReader(respStream, System.Text.Encoding.GetEncoding("utf-8"));
string msgResponseString = msgSr.ReadToEnd();
msgSr.Close();
sessionCode = msgResponseString.Substring(123, 5);
}
Response.Write("Message Sent Successfully");
}
catch (Exception ex)
{
Response.Write("Sending Failed, Please Try Again<br/>" + ex.Message);
}
}
}
The application stops when it reaches this line
msgStream.Write(msgData, 0, msgData.Length);
Please help me solve the error. Thank You
When you call GetResponse()
it will cause the request built so far to be sent, and the client to fetch the response.
You need to build your complete request before calling GetResponse()
, or your request won't be complete. Getting the request stream and writing POST data after GetResponse()
was called will throw this exception to show that continuing building the request after it has already been sent makes no sense.
这篇关于错误:流不支持并发IO读取或写入操作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!