我有一个web服务项目c#,当我上传我的项目@live时,我收到此错误:
System.IO.IOException:进程无法访问该文件 'E:\网站\ www.bivolino.com \ bivolino3D \ bivo \ imgGal \ ProductFeedBeslist.xml' 因为它正被另一个进程使用。在 System.IO .__ Error.WinIOError(Int32 errorCode,String maybeFullPath)
在System.IO.FileStream.Init(字符串路径,FileMode模式,FileAccess 访问,Int32权限,布尔useRights,FileShare共享,Int32 bufferSize,FileOptions选项,SECURITY_ATTRIBUTES secAttrs,String System.IO.FileStream..ctor中的msgPath,Boolean bFromProxy(String 路径,FileMode模式,FileAccess访问,FileShare共享)at System.Xml.XmlTextWriter..ctor(String filename,Encoding encoding)
在ws_og_bivolinogallery.GetItemsBeslist()中 E:\网站\ www.bivolino.com \ bivolino3D \ bivo \ OpenGarments \ og_webservice \ App_Code文件\ ws_og_bivolinogallery.cs:线 1186
在我的本地(本地服务器)中,当我运行我的项目时,一切正常,但@live(实时服务器)我的所有方法都不再工作了。 这是我的代码(例如我的新方法):
[WebMethod(MessageName = "GetItemsBeslist", Description = "Get a list of GAL shirts", CacheDuration = 3600)]
public XmlDocument GetItemsBeslist()
{
XmlTextWriter textWriter = new XmlTextWriter("E:/Sites/www.bivolino.com/bivolino3D/bivo/imgGal/ProductFeedBeslist.xml", Encoding.UTF8);
//E:/Sites/www.bivolino.com/bivolino3D/bivo/imgGal
try
{
if (bRegisterIP)
{
try { LogFiler.ToLog("### IP ### - [" + sRemoteAddress + "]"); }
catch { }
}
XmlDocument xProducts = new XmlDocument();
XmlElement subElm;
XmlElement elmAttr;
XmlNode elmValue;
xProducts.CreateXmlDeclaration("1.0", "utf-8", null);
XmlElement topElm = xProducts.CreateElement("ProductFeed");
topElm.SetAttribute("version", "1.0");
topElm.SetAttribute("timestamp", System.DateTime.Now.ToString().Replace(" ", ":"));
xProducts.AppendChild(topElm);
List<string[]> strarrVelden = new List<string[]>();
strarrVelden.AddRange(DB.GetItemsBeslist());
foreach (string[] rij in strarrVelden)
{
subElm = xProducts.CreateElement("Product");
elmAttr = xProducts.CreateElement("ProductTitle");
elmValue = xProducts.CreateNode(XmlNodeType.Text, "ProductTitle", null); elmValue.Value = "Herenoverhemd Bivolino " + rij[5].ToString();
elmAttr.AppendChild(elmValue);
subElm.AppendChild(elmAttr);
elmAttr = xProducts.CreateElement("Price");
elmValue = xProducts.CreateNode(XmlNodeType.Text, "Price", null); elmValue.Value = rij[6].ToString().Replace(",", ".");
elmAttr.AppendChild(elmValue);
subElm.AppendChild(elmAttr);
elmAttr = xProducts.CreateElement("productURL");
elmValue = xProducts.CreateNode(XmlNodeType.CDATA, "productURL", null); elmValue.Value = rij[1].ToString();
elmAttr.AppendChild(elmValue);
subElm.AppendChild(elmAttr);
elmAttr = xProducts.CreateElement("Category");
elmValue = xProducts.CreateNode(XmlNodeType.Text, "Category", null); elmValue.Value = "Herenoverhemd ";
elmAttr.AppendChild(elmValue);
subElm.AppendChild(elmAttr);
elmAttr = xProducts.CreateElement("ProductDescription");
elmValue = xProducts.CreateNode(XmlNodeType.Text, "ProductDescription", null); elmValue.Value = rij[2].ToString();
elmAttr.AppendChild(elmValue);
subElm.AppendChild(elmAttr);
topElm.AppendChild(subElm);
}
textWriter.WriteStartDocument();
xProducts.Save(textWriter);
textWriter.WriteEndDocument();
textWriter.Close();
return xProducts;
}
catch (Exception ex)
{
return ErrHandle("ERROR - GetItemsBeslist - " + ex.Message, "ERROR - GetItemsBeslist");
}
}
通常这些错误来自未关闭的文件流,但我已经处理过了。我想我已经忘记了一个重要的步骤,但无法弄清楚在哪里。非常感谢你的帮助
答案 0 :(得分:1)
我只在方法结束时(当我们真正需要它时)创建XmlTextWriter
并且我也使用了一个使用块。 using (var textWriter = new XmlTextWriter ("")) { ... }
而且,这个方法可以同时被不同的线程调用吗?如果是这样,你必须处理并发。
答案 1 :(得分:0)
尝试将你的流ctor包装在`using:
中using (XmlTextWriter textWriter = new XmlTextWriter("E:/Sites/www.bivolino.com/bivolino3D/bivo/imgGal/ProductFeedBeslist.xml", Encoding.UTF8)){
...
}
您的代码似乎不会在异常时关闭流,using
负责处理。即使XmlTextWriter是IDisposable,它可能需要一些时间才能处理掉,你可能会在发生这种情况之前使用你的方法。
另外 - 了解序列化,很可能不需要像你那样手动创建XML。
答案 2 :(得分:0)
考虑使用Server.MapPath
或HostingEnvironment
来获取文件系统链接。使用声明应该处理这个问题。
[WebMethod(MessageName = "GetItemsBeslist", Description = "Get a list of GAL shirts", CacheDuration = 3600)]
public XmlDocument GetItemsBeslist()
{
if (bRegisterIP)
{
try { LogFiler.ToLog("### IP ### - [" + sRemoteAddress + "]"); }
catch { }
}
try
{
var xProducts = GetProducts();
string file = Server.MapPath("/bivolino3D/bivo/imgGal/ProductFeedBeslist.xml");
using(XmlTextWriter textWriter = new XmlTextWriter(file, Encoding.UTF8))
{
textWriter.WriteStartDocument();
xProducts.Save(textWriter);
textWriter.WriteEndDocument();
}
return xProducts;
}
catch (Exception ex)
{
return ErrHandle("ERROR - GetItemsBeslist - " + ex.Message, "ERROR - GetItemsBeslist");
}
}
private XmlDocument GetProducts()
{
XmlDocument xProducts = new XmlDocument();
XmlElement subElm;
XmlElement elmAttr;
XmlNode elmValue;
xProducts.CreateXmlDeclaration("1.0", "utf-8", null);
XmlElement topElm = xProducts.CreateElement("ProductFeed");
topElm.SetAttribute("version", "1.0");
topElm.SetAttribute("timestamp", System.DateTime.Now.ToString().Replace(" ", ":"));
xProducts.AppendChild(topElm);
List<string[]> strarrVelden = new List<string[]>();
strarrVelden.AddRange(DB.GetItemsBeslist());
foreach (string[] rij in strarrVelden)
{
subElm = xProducts.CreateElement("Product");
elmAttr = xProducts.CreateElement("ProductTitle");
elmValue = xProducts.CreateNode(XmlNodeType.Text, "ProductTitle", null); elmValue.Value = "Herenoverhemd Bivolino " + rij[5].ToString();
elmAttr.AppendChild(elmValue);
subElm.AppendChild(elmAttr);
elmAttr = xProducts.CreateElement("Price");
elmValue = xProducts.CreateNode(XmlNodeType.Text, "Price", null); elmValue.Value = rij[6].ToString().Replace(",", ".");
elmAttr.AppendChild(elmValue);
subElm.AppendChild(elmAttr);
elmAttr = xProducts.CreateElement("productURL");
elmValue = xProducts.CreateNode(XmlNodeType.CDATA, "productURL", null); elmValue.Value = rij[1].ToString();
elmAttr.AppendChild(elmValue);
subElm.AppendChild(elmAttr);
elmAttr = xProducts.CreateElement("Category");
elmValue = xProducts.CreateNode(XmlNodeType.Text, "Category", null); elmValue.Value = "Herenoverhemd ";
elmAttr.AppendChild(elmValue);
subElm.AppendChild(elmAttr);
elmAttr = xProducts.CreateElement("ProductDescription");
elmValue = xProducts.CreateNode(XmlNodeType.Text, "ProductDescription", null); elmValue.Value = rij[2].ToString();
elmAttr.AppendChild(elmValue);
subElm.AppendChild(elmAttr);
topElm.AppendChild(subElm);
}
return xProducts;
}
答案 3 :(得分:0)
我还会在textWriter.Close()之前调用textWriter.Flush(),或者作为使用块的最后一行。有时.NET需要一段时间才能从缓冲区写入关闭时IO操作的基础流,这可能会锁定您的文件。
答案 4 :(得分:0)
你应该在真正需要时尝试打开文件并序列化多个线程的访问权限。
而不是在方法的开头打开文本编写器,在需要它的地方打开它,即在方法结束时还定义静态全局对象objLock,你可以在其上进行锁定。这应该工作
private static object objLock = new object();
lock(objLock)
{
using (XmlTextWriter textWriter = new XmlTextWriter("E:/Sites/www.bivolino.com/bivolino3D/bivo/imgGal/ProductFeedBeslist.xml", Encoding.UTF8))
{
textWriter.WriteStartDocument();
xProducts.Save(textWriter);
textWriter.WriteEndDocument();
textWriter.Close();
}
}