从.NET web应用程序导出到Outlook(.ics文件)

本文关键字:Outlook ics 文件 NET web 应用程序 | 更新日期: 2023-09-27 17:58:05

基本上,我试图从C#web应用程序创建和导出一个.ics文件,这样用户就可以保存它,并在Outlook中打开它,为他们的日历添加一些内容。

这是我现在的代码。。。

string icsFile = createICSFile(description, startDate, endDate, summary);
//Get the paths required for writing the file to a temp destination on 
//the server. In the directory where the application runs from.
string codeBase = Assembly.GetExecutingAssembly().CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
string assPath = Path.GetDirectoryName(path).ToString();
string fileName = emplNo + "App.ics";
string fullPath = assPath.Substring(0, assPath.Length-4);
fullPath = fullPath + @"'VTData'Calendar_Event'UserICSFiles";
string writePath = fullPath + @"'" + fileName; //writepath is the path to the file itself.
//If the file already exists, delete it so a new one can be written.
if (File.Exists(writePath))
{
    File.Delete(writePath);
}
//Write the file.
using (System.IO.StreamWriter file = new System.IO.StreamWriter( writePath, true))
{
    file.WriteLine(icsFile);
}

以上内容非常有效。它首先写入文件并删除所有旧文件。

我的主要问题是如何将其发送给用户?

我尝试将页面直接重定向到文件的路径:

Response.Redirect(writePath);

它不起作用,并抛出以下错误:

htmlfile: Access is denied.

注意:如果复制并粘贴writePath的内容,并将其粘贴到Internet Explorer中,则会打开一个保存文件对话框,允许我下载.ics文件。

我还试图提示一个保存对话框来下载文件,

System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
response.ClearContent();
response.Clear();
response.ContentType = "text/plain";
response.AddHeader("Content-Disposition", "inline; filename=" + fileName + ";");
response.TransmitFile(fullPath);
response.Flush(); // Error happens here
response.End();

它也不起作用。

Access to the path 'C:'VT'VT-WEB MCSC'*some of path omitted *'VTData'Calendar_Event'UserICSFiles' is denied.

再次出现拒绝访问错误。

可能是什么问题?

从.NET web应用程序导出到Outlook(.ics文件)

听起来您正试图为用户提供文件的物理路径,而不是虚拟路径。尝试更改路径,使其以www.yoursite.com/date.ics格式结束。这将允许您的用户下载。问题是他们没有权限访问您服务器上的C驱动器。

以下是如何做到这一点的链接:

http://www.west-wind.com/weblog/posts/2007/May/21/Downloading-a-File-with-a-Save-As-Dialog-in-ASPNET

基本上,您的代码中需要以下行:

Response.TransmitFile( Server.MapPath("~/VTData/Calendar_Event/UserICSFiles/App.ics") );

用这个代替Response.Redirect(writePath);,你应该可以走了。