Web方法参数保持为空

时间:2009-09-22 08:24:09

标签: c# iphone xml soap

我正在开发一个iPhone应用程序,它将SOAP消息发送到.NET Web服务以调用多个WebMethod。这些方法从数据库中获取数据并将其在SOAP消息中返回给iPhone。

当我发送一条没有任何参数调用WebMethod的SOAP消息时,它可以正常工作。

但是当我使用消息传递参数时,webMethod参数在visual studio调试器中保持为null。看起来WebMethod没有收到任何东西。

我使用网络嗅探器来查看传入的数据包,并注意到SOAP消息在它出现时是可以的。所以它必须是Web服务端出错的地方。

这里有一些代码:

WebMethod:

public class ZDFMobielWebservice : System.Web.Services.WebService
{

    [WebMethod]
    public string getVerzekerde(string bsn)
    {          
        string result = bsn;
        ZDFKoppeling koppeling = new ZDFKoppeling();
        result = koppeling.getData(Convert.ToInt32(bsn));
        return result;
    }
}

创建SOAP消息的函数:

-(IBAction)buttonClick:(id)sender
{
  recordResults = FALSE;

  NSString *soapMessage = [NSString stringWithFormat:
  @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
  "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"    xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
  "<soap:Body>\n"
  "<getVerzekerde xmlns=\"http:/meijberg.topicus.local/zdfmobiel\">\n"
  "<bsn>%@</bsn>\n"
  "</getVerzekerde>\n"    
  "</soap:Body>\n"
  "</soap:Envelope>\n", bsnInput.text
  ];
  NSLog(soapMessage);

  NSURL *url = [NSURL URLWithString:@"http://meijberg.topicus.local/ZDFMobielWebservice.asmx"];
  NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url];
  NSString *msgLength = [NSString stringWithFormat:@"%d", [soapMessage length]];

  [theRequest addValue: @"text/xml; charset=utf-8" forHTTPHeaderField:@"Content-Type"];
  [theRequest addValue: @"http://meijberg.topicus.local/zdfmobiel/getVerzekerde" forHTTPHeaderField:@"SOAPAction"];
  [theRequest addValue: msgLength forHTTPHeaderField:@"Content-Length"];
  [theRequest setHTTPMethod:@"POST"];
  [theRequest setHTTPBody: [soapMessage dataUsingEncoding:NSUTF8StringEncoding]];

  NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

  if( theConnection )
  {
     webData = [[NSMutableData data] retain];
  }
  else
  {
     NSLog(@"theConnection is NULL");
  }

  //[nameInput resignFirstResponder];

}

这里是SOAP消息:

<?xml version="1.0" encoding="utf-8"?>
  <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
    <soap:Body>
      <getVerzekerde xmlns="http:/meijberg.topicus.local/zdfmobiel">
        <bsn>999999999</bsn>
      </getVerzekerde>
    </soap:Body>
  </soap:Envelope>

有谁知道问题可能是什么?

编辑:当我从Web服务器自动生成的网页调用webmethod时,它运行良好。然后参数填入我输入的值。

2 个答案:

答案 0 :(得分:1)

经过多次网络搜索,我找到了答案。

我使用SoapUI工具(http://www.soapui.org/)向我的webservice发送一些soap消息。 SoapUI显示了它发送给Web服务的XML消息,因此我发现iPhone应用程序中的消息语法不正确。

而不是:

 NSString *soapMessage = [NSString stringWithFormat:
 @"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
 "<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"    xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">\n"
 "<soap:Body>\n"
 "<getVerzekerde xmlns=\"http:/meijberg.topicus.local/zdfmobiel\">\n"
 "<bsn>%@</bsn>\n"
 "</getVerzekerde>\n"    
 "</soap:Body>\n"
 "</soap:Envelope>\n", bsnInput.text
  ];

必须是这样的:

    NSString *soapMessage = [NSString stringWithFormat:
@"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
"<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:zdf=\"http://meijberg.topicus.local/zdfmobiel\">\n"
"<soapenv:Body>\n"
"<zdf:getVerzekerde>\n"
"<zdf:bsn>%@</zdf:bsn>\n"
"</zdf:getVerzekerde>\n"
"</soapenv:Body>\n"
"</soapenv:Envelope>\n", bsnInput.text
];

尽管如此,我真的不明白为什么这样做..可能它与所有标签中的分号关键字有关。有人可以解释一下吗?

答案 1 :(得分:0)

在这一行:

<getVerzekerde xmlns=\"http:/meijberg.topicus.local/zdfmobiel\">

你需要在地址后面加一个斜杠(在zdfmobiel之后):

<getVerzekerde xmlns=\"http:/meijberg.topicus.local/zdfmobiel/\">