0

私は webservice プロジェクト c# を持っています。プロジェクト @live をアップロードすると、次のエラーが発生します。

System.IO.IOException: 別のプロセスで使用されているため、プロセスはファイル 'E:\Sites\www.bivolino.com\bivolino3D\bivo\imgGal\ProductFeedBeslist.xml' にアクセスできません。System.IO.__Error.WinIOError (Int32 errorCode、文字列の多分フルパス)
で System.IO.FileStream.Init (文字列パス、FileMode モード、FileAccess アクセス、Int32 権限、ブール値の useRights、FileShare 共有、Int32 bufferSize、FileOptions オプション、SECURITY_ATTRIBUTES secAttrs 、String msgPath、Boolean bFromProxy) at System.IO.FileStream..ctor(String パス、FileMode モード、FileAccess アクセス、FileShare 共有) at System.Xml.XmlTextWriter..ctor(String filename、Encoding encoding)
e:\Sites\www.bivolino.com\bivolino3D\bivo\OpenGarments\og_webservice\App_Code\ws_og_bivolinogallery.cs:line 1186 の ws_og_bivolinogallery.GetItemsBeslist() で

私のローカル(ローカルサーバー)では、プロジェクトを実行するとすべて問題ありませんが、@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");
   }

}

通常、これらのエラーは閉じられていないファイル ストリームから発生しますが、私はそれを処理しました。重要なステップを忘れたと思いますが、どこにあるのかわかりません。ご助力ありがとうございます

4

5 に答える 5

1

メソッドの最後にのみ作成しXmlTextWriter(実際に必要な場合)、using ブロックも使用します。using (var textWriter = new XmlTextWriter ("")) { ... } また、このメソッドを異なるスレッドから同時に呼び出すことはできますか? その場合、並行性を処理する必要があります。

于 2013-03-14T14:25:38.453 に答える
0

ストリームctorを`using:でラップしてみてください

using (XmlTextWriter textWriter = new XmlTextWriter("E:/Sites/www.bivolino.com/bivolino3D/bivo/imgGal/ProductFeedBeslist.xml", Encoding.UTF8)){

...
}

あなたのコードは例外時にストリームを閉じていないようです、usingそれを処理します。XmlTextWriterはIDisposableですが、破棄されるまでに時間がかかる場合がありますが、それが発生する前にメソッドをヒットしている可能性があります。

また、シリアル化について学びましょう。XMLを手動で作成する必要がない可能性があります。

于 2013-03-14T14:24:10.280 に答える
0

Server.MapPathまたはHostingEnvironmentを使用して、ファイル システム リンクを取得することを検討してください。using ステートメントで問題を処理する必要があります。

[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;
}
于 2013-03-14T14:34:05.763 に答える
0

また、textWriter.Close() の前に、または使用ブロックの最後の行として textWriter.Flush() を呼び出します。.NET では、クローズ時の IO 操作でバッファーから基になるストリームに書き込むのに時間がかかる場合があり、ファイルがロックされる可能性があります。

于 2013-03-14T14:34:52.063 に答える
0

本当に必要なときにファイルを開こうとし、複数のスレッドのアクセスをシリアル化します。

method の開始時にテキストライターを開くのではなく、必要な場所で開きます。つまり、メソッドの終了時に、ロックを取得できる静的グローバル オブジェクト 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();


     }

 }
于 2013-03-14T14:43:27.370 に答える