windows服务 post数据问题(急!急!)

西瓜爱吃橘子 2010-12-22 08:58:04
虾米我用windows服务 扫描数据库将数据库里的数据Post给别的网站。
用的是计时器控件,每隔一定的时间进行自动扫描Post。

问题出现在运行服务后:只更新POST数据库中的两条记录,其它的就不动了,调试了下好像是在POST数据时 响应时间太长了,程序一直在POST等侍,我就把POST的响应时间TimeOut设置为10秒,结果还是只更新POST了两条记录,后面的就不动了。。

代码:

namespace RpEmailService
{
partial class MailService
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.IContainer components = null;

/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
/// <param name="disposing">如果应释放托管资源,为 true;否则为 false。</param>
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}

#region 组件设计器生成的代码

/// <summary>
/// 设计器支持所需的方法 - 不要
/// 使用代码编辑器修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.tmiService = new System.Timers.Timer();
((System.ComponentModel.ISupportInitialize)(this.tmiService)).BeginInit();
//
// tmiService
//
this.tmiService.Interval = 5000;
this.tmiService.Elapsed += new System.Timers.ElapsedEventHandler(this.tmiService_Elapsed);
//
// MailService
//
this.ServiceName = "MailService";
((System.ComponentModel.ISupportInitialize)(this.tmiService)).EndInit();

}

#endregion

private System.Timers.Timer tmiService;



}
}


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using Model;
using hMailServer;
using System.Xml;
using System.Net;
using System.IO;
using System.Xml.Linq;
namespace RpEmailService
{

public partial class MailService : ServiceBase
{

public MailService()
{
InitializeComponent();
}

/// <summary>
/// 开始服务
/// </summary>
/// <param name="args"></param>
protected override void OnStart(string[] args)
{
this.tmiService.Enabled = true;
}

/// <summary>
/// 停止服务
/// </summary>
protected override void OnStop()
{
this.tmiService.Enabled = false;
}

private void tmiService_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
this.tmiService.Enabled = false;
CallBackMail();
this.tmiService.Enabled = true;
}

#region Post更新后的未回复邮件
/// <summary>
/// Post更新后的未回复邮件
/// </summary>
private void CallBackMail()
{
List<ClientMessages> replyMails = BLL.ClientMessagesBLL.SelectClientMessage();//获取未回复邮件
if (replyMails != null && replyMails.Count > 0)
{
//Post邮件信息,更新未回复邮件
for (int i = 0; i < replyMails.Count; i++)
{
FileStream fs = new FileStream("E://MailLog.txt", FileMode.Append);
StreamWriter sw = new StreamWriter(fs);//重写该文件,不存在则创建
sw.WriteLine("----------------i--------------------");
sw.WriteLine(i);
sw.WriteLine("----------------replyMails.Count--------------------");
sw.WriteLine(replyMails.Count);
sw.Flush();
sw.Close();
fs.Close();
//得到邮件的装态
DeliveryStatus d = new DeliveryStatusClass();
String status = "";//邮件发送状态
switch (d.GetDeliveryStatus(replyMails[i].ServerMessageGUID, replyMails[i].ClientToAddress))
{
case "SendFail":
status = "发送失败";
break;
case "SendOK":
status = "发送成功";
break;
case "NoRecord":
status = "没有此记录";
break;
case "SendQuotas":
status = "发件人邮箱已满,拒绝发送邮件";
break;
default:
status = "未获取到发送状态";
break;
}
String mailStr = string.Format(@"<?xml version='1.0' encoding='UTF-8'?><SendStatus><mail gid={0} recipientaddress ={1} status={2}/></SendStatus>", replyMails[i].ClientMessageGID, replyMails[i].ClientToAddress, status);
try
{
String result = PostDataToUrl(mailStr, replyMails[i].ClientCallBackAddress);
if (result.Equals("OK"))
{
//更新邮件回复状态为已读
BLL.ClientMessagesBLL.UpdateMessageReplyed(replyMails[i].ClientMessageID);
}
}
catch (Exception ex)
{
FileStream fs1 = new FileStream("E://MailLog1.txt", FileMode.Append);
StreamWriter sw1 = new StreamWriter(fs);//重写该文件,不存在则创建

sw1.WriteLine("----------------Exception--------------------");
sw1.WriteLine(ex.Message);
sw.Flush();
sw.Close();
fs.Close();
continue;
}
}
}
}
#endregion

#region post
const string sUserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2; .NET CLR 1.1.4322; .NET CLR 2.0.50727)";
const string sContentType =
"application/x-www-form-urlencoded";
const string sResponseEncoding = "gb2312";
/// <summary>
/// 数据转换类型
/// </summary>
/// <param name="data">要post的数据</param>
/// <param name="url">目标url</param>
/// <returns>服务器响应</returns>
static string PostDataToUrl(string data, string url)
{
Encoding encoding = Encoding.Unicode;
byte[] bytesToPost = encoding.GetBytes(data);
return PostDataToUrl(bytesToPost, url);
}

/// <summary>
/// Post data到url
/// </summary>
/// <param name="data">要post的数据</param>
/// <param name="url">目标url</param>
/// <returns>服务器响应</returns>
static string PostDataToUrl(byte[] data, string url)
{
WebRequest webRequest = WebRequest.Create(url);
HttpWebRequest httpRequest = webRequest as HttpWebRequest;
if (httpRequest == null)
{
throw new ApplicationException(
string.Format("Invalid url string: {0}", url)
);
}

httpRequest.UserAgent = sUserAgent;
httpRequest.ContentType = sContentType;
httpRequest.Method = "POST";
httpRequest.Timeout = 5000;
httpRequest.ContentLength = data.Length;
Stream requestStream = httpRequest.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();

// Stream responseStream;
string stringResponse = string.Empty;
try
{
//解析服务器返回状态信息
//responseStream = httpRequest.GetResponse().GetResponseStream();

// using (StreamReader responseReader =
// new StreamReader(responseStream, Encoding.GetEncoding(sResponseEncoding)))
// {
// stringResponse = responseReader.ReadToEnd();
// }
//responseStream.Close();
HttpWebResponse cnblogsRespone = (HttpWebResponse)httpRequest.GetResponse();
stringResponse = cnblogsRespone.StatusCode.ToString();
}
catch
{

}
return stringResponse;
}
#endregion



}
}
...全文
166 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
西瓜爱吃橘子 2010-12-23
  • 打赏
  • 举报
回复
问题解决了!

是在Post XML数据时数据流问题

//将:
httpRequest.ContentType = sContentType;
//改为:
httpRequest.ContentType ="text/XML";
//还有在抛XML格式的数据时,最好生成XML对象然后生成byte[]数据流
XmlDocument xmldoc = CreatXml();//创建邮件XML对象
byte[] mail = System.Text.Encoding.UTF8.GetBytes(xmldoc.InnerXml);//解释成POST的数据流

//不建议自己直接拼接XML字符串POST出去

//小小的一点经验,希望能帮助大家。嘿嘿!
西瓜爱吃橘子 2010-12-22
  • 打赏
  • 举报
回复
别沉呀,!!!求解决!
烈火蜓蜻 2010-12-22
  • 打赏
  • 举报
回复
做服务做个异常日志记录的功能,后面的不更新,也许是服务出异常了,

给你推荐一个,专门用于服务器定时的组件
http://blog.csdn.net/Linux7985/archive/2010/08/27/5843394.aspx
bbspc_ 2010-12-22
  • 打赏
  • 举报
回复
求救希望大侠能给我解决解决问题谢谢!
http://topic.csdn.net/u/20101222/15/a4c712a0-01d1-4d25-87c2-48c65d9368c7.html
phyllis2001 2010-12-22
  • 打赏
  • 举报
回复
肯定有错误,跟踪调试一下执行完第二条记录后到执行第三条时发生什么错误~~
烈火蜓蜻 2010-12-22
  • 打赏
  • 举报
回复
服务肯定是出异常了,或是怎么回事了,
你记录一下这个异常,然后解决这个异常,问题就搞定了,

110,565

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧