我正在开发一个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时,它运行良好。然后参数填入我输入的值。
答案 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/\">