我有一个小型的Intranet服务,我需要在我们将测试配置从一个域提交到另一个域时工作,没有域信任将被设置并且由于输入模板改变了很多数据,我们决定使用Infopath为实验室的脚本编写人员/测试人员输入数据。我想,呃,也许我应该做一个小型的WCF服务器并将其托管在我们的IIS服务器上......这应该很简单,对吗?如何使用Infopath将表单提交到WCF Web服务
队列笑
我测试的连接出已经使用一个简单的字符串从InfoPath中提交的bool TestInfoPathSubmit(string testString);
的OperationContract的它的工作原理开发服务器和生产服务器减去几个许可尖峰似乎总是在罚款两即将发生。
我已经有很多用于这个ResultDataSet.xsd
文件,我们从一个工作的XML生成并使用.NET xsd.exe
应用程序,所以我知道它是有效的,所以我可能可以跳过链接该代码。但这里是它的其余部分:
接口/合同
[DataContractFormat(Style = OperationFormatStyle.Document)]
[ServiceContract]
public interface IService
{
[XmlSerializerFormat]
[OperationContract]
bool ResultFromInfopath(XmlDocument xdoc);
}
注:[XmlSerializerFormat]
已经注意到回避问题是XmlDocument
不能被序列化/反序列化在WCF。
服务
public class Service1 : IService
{
public bool ResultFromInfopath(XmlDocument xdoc)
{
try
{
var xreader = new XmlNodeReader(xdoc);
var dataset = new ResultDataSet();
dataset.ReadXml(xreader);
Debug.Print("XML has been read in and ready to process");
return true;
}
catch (Exception ex)
{
Debug.Print(ex.Message);
return false;
}
}
}
web配置
<?xml version="1.0"?>
<configuration>
<appSettings>
<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
</appSettings>
<system.web>
<compilation debug="true" targetFramework="4.5" />
<httpRuntime targetFramework="4.5"/>
</system.web>
<system.serviceModel>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="true" httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
<protocolMapping>
<add binding="basicHttpBinding" scheme="http" />
</protocolMapping>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" multipleSiteBindingsEnabled="true" />
</system.serviceModel>
<system.webServer>
<modules runAllManagedModulesForAllRequests="true"/>
<directoryBrowse enabled="true"/>
</system.webServer>
</configuration>
没什么特别的,尽量保持其简单。我使用xsd文件创建了Infopath文档模板,并将提交链接到Web服务,并选择了作为完整的XmlDocument提交的选项,包括处理指令。这是我犯了一个错误。 不包括包括处理说明。 MSDN - XmlDictionaryReader是消息流的默认解码器,它不会接受嵌入InfoPath中的XmlDocument
中的处理指令。
你得到的错误是提交无法完成:
InfoPath cannot submit the form.
An error occurred while the form was being submitted.
The SOAP response indicates that an error occurred:
Error in deserializing body of request message for operation 'ResultFromInfopath'.
<detail>
<ExceptionDetail xmlns="http://schemas.datacontract.org/2004/07/System.ServiceModel" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<HelpLink i:nil="true"/>
<InnerException>
<HelpLink i:nil="true"/>
<InnerException>
<HelpLink i:nil="true"/>
<InnerException i:nil="true"/>
<Message>
Processing instructions (other than the XML declaration) and DTDs are not supported. Line 1, position 485.
</Message>
<StackTrace>
at System.Xml.XmlExceptionHelper.ThrowXmlException(XmlDictionaryReader reader, String res, String arg1, String arg2, String arg3)
at System.Xml.XmlUTF8TextReader.ReadDeclaration()
at System.Xml.XmlUTF8TextReader.Read()
at System.Xml.XmlLoader.LoadNode(Boolean skipOverWhitespace)
at System.Xml.XmlLoader.ReadCurrentNode(XmlDocument doc, XmlReader reader)
at System.Xml.XmlDocument.ReadNode(XmlReader reader)
at System.Xml.Serialization.XmlSerializationReader.ReadXmlNode(Boolean wrapped)
at System.Xml.Serialization.XmlSerializationReader.ReadXmlDocument(Boolean wrapped)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderIService.Read2_ResultFromInfopath()
at Microsoft.Xml.Serialization.GeneratedAssembly.ArrayOfObjectSerializer1.Deserialize(XmlSerializationReader reader)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
</StackTrace>
<Type>
System.Xml.XmlException
</Type>
</InnerException>
<Message>
There is an error in XML document (1, 485).
</Message>
<StackTrace>
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle, XmlDeserializationEvents events)
at System.Xml.Serialization.XmlSerializer.Deserialize(XmlReader xmlReader, String encodingStyle)
at System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, XmlSerializer serializer, MessagePartDescription returnPart, MessagePartDescriptionCollection bodyParts, Object[] parameters, Boolean isRequest)
</StackTrace>
<Type>
System.InvalidOperationException
</Type>
</InnerException>
<Message>
Error in deserializing body of request message for operation 'ResultFromInfopath'.
</Message>
<StackTrace>
at System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, XmlSerializer serializer, MessagePartDescription returnPart, MessagePartDescriptionCollection bodyParts, Object[] parameters, Boolean isRequest)
at System.ServiceModel.Dispatcher.XmlSerializerOperationFormatter.DeserializeBody(XmlDictionaryReader reader, MessageVersion version, String action, MessageDescription messageDescription, Object[] parameters, Boolean isRequest)
at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeBodyContents(Message message, Object[] parameters, Boolean isRequest)
at System.ServiceModel.Dispatcher.OperationFormatter.DeserializeRequest(Message message, Object[] parameters)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.DeserializeInputs(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage41(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage31(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage11(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage1(MessageRpc& rpc)
at System.ServiceModel.Dispatcher.MessageRpc.Process(Boolean isOperationContextSet)
</StackTrace>
<Type>
System.ServiceModel.CommunicationException
</Type>
</ExceptionDetail>
</detail>
回答如下。