0

我有两个 Web 服务GetStreetsGetCities,它们同时使用另一个称为Location的 Web 服务(不要问我为什么这样做,我只是必须这样做)。问题在于这些 Web 服务在我的 .net 应用程序中几乎同时被调用。

我的问题是,我怎样才能让其中一个等到 Soap Extension for Location 中发生的写入完成后再写入,或者如何将文件重命名为写入位置,以便两个服务写入每次都不一样的文件。

创建文件名的 GetInitializer 方法:

    public override object GetInitializer(Type WebServiceType)
    {
        string filename = string.Format("{0}_{1}_{2}.log", WebServiceType.FullName, methodName, DateTime.Now.ToString("yyyyMMdd"));
        return ConfigurationManager.AppSettings["SoapLogPath"] + "\\" + filename;
    }

PS:我已经使用 using 和 lock:

    public override void ProcessMessage(SoapMessage message)
    {
        lock (thisLock)
        {
            switch (message.Stage)
            {
                case SoapMessageStage.BeforeSerialize:
                    //WriteOutput(message);
                    break;
                case SoapMessageStage.AfterSerialize:
                    WriteOutput(message);
                    break;
                case SoapMessageStage.BeforeDeserialize:
                    WriteInput(message);
                    break;
                case SoapMessageStage.AfterDeserialize:
                    break;
                default:
                    break;
            }
        }
    }

    /// <summary>
    /// The method writes away the input message
    /// </summary>
    /// <param name="message">The soap message that will be logged</param>
    public void WriteOutput(SoapMessage message)
    {
        newStream.Position = 0;
        using(FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.Write))
        {
            using(StreamWriter w = new StreamWriter(fs))
            {
                string soapString = (message is SoapServerMessage) ? Environment.NewLine + "Output SoapResponse" : "Output SoapRequest";
                w.WriteLine("-----" + soapString + " at " + DateTime.Now);
                Copy(newStream, fs);
                newStream.Position = 0;
                Copy(newStream, oldStream);
            }
        }
        //Force clean up
        GC.Collect();
    }
4

1 回答 1

0

应用锁是一步,但我也提供了读取权限: using(FileStream fs = new FileStream(filename, FileMode.Append, FileAccess.ReadWrite))

于 2013-09-23T11:56:32.207 回答