WCF服务方法中的XmlDocument未使用类的save方法成功保存到文件

时间:2012-08-20 14:02:52

标签: c# .net xml web-services silverlight-5.0

您好,并提前感谢, 我试图从silverlight应用程序中的文本框和按钮单击触发的事件中获取输入,将它们转换为xml字符串,将字符串和指定的文件名传递给WCF服务调用,并在该调用中保存xml到指定的文件(通过字符串参数)。将文本捕获到xml字符串中的代码似乎成功运行(基于我在调试时在变量中看到的内容),看起来像这样:

    private void ServerInfoNext_Click(object sender, RoutedEventArgs e)
                {

                    //new RegisterServerGroupObject instance
                    RegisterServerGroupObject groupInfo= new RegisterServerGroupObject(groupNameTB.Text,1,parentServerNameTB.Text,LeaderNameCB.SelectedItem.ToString());

                    var serializer = new XmlSerializer(typeof(RegisterServerGroupObject));
                    XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
                    ns.Add("","");

                    XmlWriterSettings settings = new XmlWriterSettings();
                    settings.Encoding = Encoding.UTF8;
                    settings.Indent = true;
                    settings.CloseOutput = true;

                    StringBuilder sb = new StringBuilder();

                    using (XmlWriter writer = XmlWriter.Create(sb,settings))
                    {
                        serializer.Serialize(writer, groupInfo);
                        writer.Close();
                    }

                    //sb now contains the xml string with the information from the serialized class
                    string contentsString = sb.ToString();
                    //create instance of XmlWrite service
                    XMLWriteServiceClient xmlClient = new XMLWriteServiceClient();
                    xmlClient.WriteXmlToServerCompleted += new EventHandler<System.ComponentModel.AsyncCompletedEventArgs>(xmlClient_WriteXmlToServerCompleted);
                    xmlClient.WriteXmlToServerAsync("ServerGroups.xml", contentsString);
    }

此时,当变量内容字符串传递给service方法时,我可以看到它有有效的xml,以及服务方法本身,如下所示:

public class XMLWriteService : IXMLWriteService
    {
        public void WriteXmlToServer(string filename,string xmlString)
        {
            XmlDocument xDoc = new XmlDocument();
            xDoc.LoadXml(xmlString.ToString());


            try
            {
                xDoc.Save(filename);


            }
            catch (FileNotFoundException e)
            {

                Console.WriteLine(e.InnerException.ToString());
            }
        }
    }

try / catch块未指示找不到文件(“ServerGroups.xml”),并且我当前在项目的服务器端部分的ClientBin中有该xml文件。 (.Web方面)。但是,在方法终止后,没有新的xml写入文件。有人可以告诉我我做错了什么吗?我不知道为什么XmlDocument类实例没有将其内容保存到文件中。提前谢谢!

2 个答案:

答案 0 :(得分:2)

您没有传递路径,因此它只是将文件保存到WCF服务进程的当前目录,无论发生什么情况。要么找出它是什么,要么在整个服务器驱动器上搜索该文件名,看看它在哪里保存它。更好的是,在保存文件名之前,调用Path.Combine来附加文件名开头的路径。例如:

xDoc.Save(Path.Combine("C:\\ClientBin", filename));

要在下面的评论中回答您的问题,如果您要将传入的XML数据附加到已存储在服务器上的XML文件中的数据,那就更复杂了。这完全取决于XML的格式。由于您使用的是序列化,默认情况下每个XML文档只允许一个对象(因为它将对象名称作为根文档元素,其中只能有一个),因此您必须使用不同的XML格式。例如,在服务器端,您需要在文档上具有某种根元素,您可以在该元素下继续附加传入的RegisterServerGroupObject对象。例如,如果服务器上的XML文件如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<ListOfRegisterServerGroupObject>
</ListOfRegisterServerGroupObject>

然后,您可以通过在该根元素中插入新元素来附加数据,如下所示:

<?xml version="1.0" encoding="utf-8" ?>
<ListOfRegisterServerGroupObject>
    <RegisterServerGroupObject>
        ...
    </RegisterServerGroupObject>
    <RegisterServerGroupObject>
        ...
    </RegisterServerGroupObject>
    ...
</ListOfRegisterServerGroupObject>

为此,您需要先加载XML文档,然后获取根元素,然后将传入的XML作为子元素追加。例如:

public void WriteXmlToServer(string filename, string xmlString)
{
    string filePath = Path.Combine("C:\\ClientBin", filename);
    XmlDocument storage = New XmlDocument();
    storage.Load(filePath); 
    XmlDocument incoming = New XmlDocument();
    incoming.LoadXml(xmlString);
    storage.DocumentElement.AppendChild(incoming.DocumentElement);
    storage.Save(filePath);
}

答案 1 :(得分:1)

您可能需要将物理路径“映射”到服务

中的输出文件

string path = HostingEnvironment.MapPath(“〜/ MyPath / MyFile.xml”);