您好,并提前感谢, 我试图从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类实例没有将其内容保存到文件中。提前谢谢!
答案 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”);