C# 使用Soap扩展同时调用两次的web服务

C# 使用Soap扩展同时调用两次的web服务,c#,web-services,C#,Web Services,我有两个web服务,GetStreets和GetCities,它们同时使用另一个名为Location的web服务(不要问我为什么这样做,我必须这么做)。问题是,在我的.net应用程序中,这些web服务几乎同时被调用 我的问题是,如何让其中一个在Soap Extension for Location中发生的写入操作完成后再进行写入,或者如何将文件重命名为写入位置,以便两个服务每次都写入不同的文件 创建文件名的GetInitializer方法: public override object

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

我的问题是,如何让其中一个在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;
    }
注意:我已经在使用和锁定:

    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();
    }
public override void ProcessMessage(SoapMessage)
{
锁(这个锁)
{
开关(消息阶段)
{
案例SoapMessageStage.BeforeSerialize:
//写输出(消息);
打破
案例SoapMessageStage.AfterSerialize:
写输出(消息);
打破
案例SoapMessageStage.BeforeDeserialize:
写入输入(消息);
打破
案例SoapMessageStage.After反序列化:
打破
违约:
打破
}
}
}
/// 
///该方法将写入输入消息
/// 
///将被记录的soap消息
public void WriteOutput(SoapMessage消息)
{
newStream.Position=0;
使用(FileStream fs=newfilestream(文件名,FileMode.Append,FileAccess.Write))
{
使用(StreamWriter w=新StreamWriter(fs))
{
字符串soapString=(消息为SoapServerMessage)?Environment.NewLine+“输出SoapResponse”:“输出SoapRequest”;
w、 WriteLine(“----”+soapString+”在“+DateTime.Now)”处);
拷贝(新闻流,fs);
newStream.Position=0;
复制(新闻流、旧流);
}
}
//强制清理
GC.Collect();
}

应用锁只是一步,但我还提供了读取权限: 使用(FileStream fs=newfilestream(文件名,FileMode.Append,FileAccess.ReadWrite))