Web服务序列化在SOAP主体中生成不需要的根

时间:2015-02-24 18:30:11

标签: web-services serialization soap

历史:

我提供了一个WSDL,我用它生成了一个服务引用。 序列化并发送到要使用的Web服务的对象是一个强类型,复杂类型的类。

我没有发送强类型的复杂类,而是想发送一个XMLDocument。

所以我修改了服务,我留下了这个:

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name =    "B2MML_ProcessProductionPerformance_MaterialConsumption_OBBinding", Namespace="http://company.com/M2D/Manufacturing/ManufacturingExecution/GoodsIssue/pi")]
public partial class B2MML_ProcessProductionPerformance_MaterialConsumption_OBService : System.Web.Services.Protocols.SoapHttpClientProtocol {

private System.Threading.SendOrPostCallback B2MML_ProcessProductionPerformance_MaterialConsumption_OBOperationCompleted;

public B2MML_ProcessProductionPerformance_MaterialConsumption_OBService() 
{
}

public event B2MML_ProcessProductionPerformance_MaterialConsumption_OBCompletedEventHandler B2MML_ProcessProductionPerformance_MaterialConsumption_OBCompleted;

[System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://sap.com/xi/WebService/soap1.1", OneWay=true, Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
public void B2MML_ProcessProductionPerformance_MaterialConsumption_OB(XmlDocument ProcessProductionPerformance)
{
    this.Invoke("B2MML_ProcessProductionPerformance_MaterialConsumption_OB", new object[] {
               ProcessProductionPerformance});
}

public System.IAsyncResult BeginB2MML_ProcessProductionPerformance_MaterialConsumption_OB(XmlDocument ProcessProductionPerformance, System.AsyncCallback callback, object asyncState)
{
    return this.BeginInvoke("B2MML_ProcessProductionPerformance_MaterialConsumption_OB", new object[] {
                ProcessProductionPerformance}, callback, asyncState);
}

public void EndB2MML_ProcessProductionPerformance_MaterialConsumption_OB(System.IAsyncResult asyncResult)
{
    this.EndInvoke(asyncResult);
}

public void B2MML_ProcessProductionPerformance_MaterialConsumption_OBAsync(XmlDocument ProcessProductionPerformance)
{
    this.B2MML_ProcessProductionPerformance_MaterialConsumption_OBAsync(ProcessProductionPerformance, null);
}

public void B2MML_ProcessProductionPerformance_MaterialConsumption_OBAsync(XmlDocument ProcessProductionPerformance, object userState)
{
    if ((this.B2MML_ProcessProductionPerformance_MaterialConsumption_OBOperationCompleted == null))
    {
        this.B2MML_ProcessProductionPerformance_MaterialConsumption_OBOperationCompleted = new System.Threading.SendOrPostCallback(this.OnB2MML_ProcessProductionPerformance_MaterialConsumption_OBOperationCompleted);
    }
    this.InvokeAsync("B2MML_ProcessProductionPerformance_MaterialConsumption_OB", new object[] {
                ProcessProductionPerformance}, this.B2MML_ProcessProductionPerformance_MaterialConsumption_OBOperationCompleted, userState);
}

private void OnB2MML_ProcessProductionPerformance_MaterialConsumption_OBOperationCompleted(object arg)
{
    if ((this.B2MML_ProcessProductionPerformance_MaterialConsumption_OBCompleted != null))
    {
        System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
        this.B2MML_ProcessProductionPerformance_MaterialConsumption_OBCompleted(this, new System.ComponentModel.AsyncCompletedEventArgs(invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
    }
}

public new void CancelAsync(object userState) 
{
    base.CancelAsync(userState);
}
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.0.30319.17929")]
public delegate void       B2MML_ProcessProductionPerformance_MaterialConsumption_OBCompletedEventHandler(object sender, System.ComponentModel.AsyncCompletedEventArgs e);

问题描述:

我能够成功发送XMLDocument,但是,如果我的XMLDocument看起来像这样:

<ProcessProductionPerformance xmlns="SomeNS">
  <ApplicationArea>Some data here</ApplicationArea>
  <DataArea>Some data there</DataArea>
</ProcessProductionPerformance>

我在SOAP Body中看到了以下内容(通过Fiddler看到):

<ProcessProductionPerformance>
   <ProcessProductionPerformance xmlns="SomeNS">
      <ApplicationArea>Some data here</ApplicationArea>
      <DataArea>Some data there</DataArea>
   </ProcessProductionPerformance>
</ProcessProductionPerformance>

信息:

1)我无权修改网络服务

2)我试图将XMLDocument ApplicationArea和XMLDocument DataArea分别打包到一个类中并尝试序列化该类,我最终在SOAP Body中使用它:

<ProcessProductionPerformance xmlns="SomeNS">
   <ApplicationArea>
      <ApplicationArea xmlns="SomeNS">Some data here</ApplicationArea>
   <ApplicationArea>
   <DataArea>
      <DataArea xmlns="SomeNS">Some data there</DataArea>
   <DataArea>
</ProcessProductionPerformance>

3)我怀疑它可能与SOAPBindingUse或SOAPBindingStyle有关吗?我根本没有改变这个,因为我对此并不了解。

4)我只是一个C#的新手。请怜悯。

修改

好吧,似乎枚举SoapBindingUse.Literal和SoapParameterStyle.Bare在这方面发挥了重要作用。但是我仍然坚持,因为我一直都在使用它。

https://msdn.microsoft.com/en-us/library/vstudio/2b4bx2t6%28v=vs.100%29.aspx

那么我错过了什么?

顺便说一句,不确定你的人是否关心客户,但我正在调用这样的服务:

var processProductionPerformance = new XmlDocument();
processProductionPerformance.LoadXml(@xmlText);
var sendPerformanceToSap = new B2MML_ProcessProductionPerformance_MaterialConsumption_OBService
            {
                    //Url = Link here,
                    //Credentials since
            };
sendPerformanceToSap.B2MML_ProcessProductionPerformance_MaterialConsumption_OBAsync(processProductionPerformance);

0 个答案:

没有答案