iOS开发笔记 基于wsdl2objc调用asp.net WebService

时间:2022-09-13 19:56:57

1.准备

先下载待会要用到的工具 WSDL2ObjC-0.6.zip WSDL2ObjC-0.7-pre1.zip

我用的是WSDL2ObjC-0.6.zip

1.1搭建asp.net WebService项目并且部署在IIS服务器上面

创建WebService服务项目后先在Web.config添加节点,设置WebService远程调试访问,否则会出现:

“测试窗体只能用于来自本地计算机的请求”

iOS开发笔记 基于wsdl2objc调用asp.net WebService

<webServices>
<protocols>
<add name="HttpSoap" />
<add name="HttpPost" />
<add name="HttpGet" />
<add name="Documentation" />
</protocols>
</webServices>

创建类库添加Model实体类

public class CourseEntity
{ private int courseID; public int CourseID
{
get { return courseID; }
set { courseID = value; }
}
private int parentID; public int ParentID
{
get { return parentID; }
set { parentID = value; }
}
private string courseName; public string CourseName
{
get { return courseName; }
set { courseName = value; }
}
private string coursePPT; public string CoursePPT
{
get { return coursePPT; }
set { coursePPT = value; }
}
private string courseVidio; public string CourseVidio
{
get { return courseVidio; }
set { courseVidio = value; }
} }

iOS开发笔记 基于wsdl2objc调用asp.net WebService事先做好Model实体类的生成dll文件,直接添加引用至bin目录下

在项目当中添加一个数据库操作类DBOperation.cs

接下来我们打开Service.cs文件。

2.asp.net WebService返回Xml Json格式数据

2.1返回Xml格式数据

service.cs代码如下:

  [WebMethod(Description = "ProblemPaper")]
public List<ProblemPaperEntity> ProblemPaper(String prkid)
{
return dbOperation.ProblemPaper(prkid);
}

DBOperation.cs代码如下:

/// <summary>
/// 题库试卷目录表 ProblemPaper
/// </summary>
/// <returns>PPID(编号)PRKID(上一级)PTID(类型编号)Name(名称)ProblemNum(目录数量))</returns>
public List<ProblemPaperEntity> ProblemPaper(String prkid)
{ List<ProblemPaperEntity> list = new List<ProblemPaperEntity>(); ProblemPaperEntity model = null; try
{
string sql = "select PPID,PRKID,PTID,Name,ProblemNum,Row_Number() over(order by PPID ) as row_number from ProblemPaper where 1=1";
sql += " and prkid in ( select * from getProblemResourseByID("+prkid+"))";
string s = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection(s);
con.Open();
SqlCommand cmd = new SqlCommand(sql, con);
SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read())
{
model = new ProblemPaperEntity(); model.PPID = reader.GetInt32();
model.PRKID = reader.GetInt32();
model.PTID = reader.GetInt32();
model.Name = reader.GetString();
model.ProblemNum = reader.GetInt32(); list.Add(model);
} reader.Close();
cmd.Dispose(); }
catch (Exception)
{ } return list; }

从service.cs代码中可以看到ProblemPaper方法前面 [WebMethod]指示web服务提供的方法

public方法能否被调用者访问取决于这个方法是否是一个“WebMethod”,在编写方法的时候注意

方法前面是否含有WebMethod

2.2返回Json格式数据

service.cs 代码如下:

[WebMethod(Description = "JsonProblemPaper2")]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public string JsonProblemPaper2(String prkid)
{
return new JavaScriptSerializer().Serialize(dbOperation.ProblemPaper(prkid));
}

DBOperation.cs代码如下:

public List<string> JsonProblemPaper(String prkid)
{ List<String> list = new List<String>(); try
{
string sql = "select PPID,PRKID,PTID,Name,ProblemNum,Row_Number() over(order by PPID ) as row_number from ProblemPaper where 1=1";
sql += " and prkid in ( select * from getProblemResourseByID(" + prkid + "))";
string s = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
SqlConnection con = new SqlConnection(s);
con.Open();
SqlCommand cmd = new SqlCommand(sql, con);
SqlDataReader reader = cmd.ExecuteReader(); while (reader.Read())
{ list.Add(reader[].ToString());
list.Add(reader[].ToString());
list.Add(reader[].ToString()) ;
list.Add(reader[].ToString());
list.Add(reader[].ToString()); } reader.Close();
cmd.Dispose(); }
catch (Exception)
{ } return list; }

返回Json格式,需要在方法前面同时声明

[WebMethod(Description = "××××")]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

返回格式: return new JavaScriptSerializer().Serialize(dbOperation.ProblemPaper(prkid));

接下来的方法编写由自己扩展,编写完WebService

 3.部署

环境windows Server2008 IIS 7.5  SqlServer2012

iOS开发笔记 基于wsdl2objc调用asp.net WebServiceiOS开发笔记 基于wsdl2objc调用asp.net WebService

选择应用程序池.Net v.2.0,切记,如在部署遇到问题可以查阅其他相关资料,在这里

就不多详细

 4.IOS基于wsdl2objc调用asp.net WebService

4.1使用wsdl2objc工具

在官网上下载有2个版本,我用的是WSDL2ObjC-0.6.zip,

部署完毕后,打开wsdl2objc

iOS开发笔记 基于wsdl2objc调用asp.net WebService

Parse WSDL后稍等15秒左右出现Finish!查看导入目录

iOS开发笔记 基于wsdl2objc调用asp.net WebService

将生成的所有文件放置在wsdl2objc文件夹

iOS开发笔记 基于wsdl2objc调用asp.net WebService

尝试编译出现错误如下:

iOS开发笔记 基于wsdl2objc调用asp.net WebService

解决方法:这里有2个错误

1."libxml/tree.h" file not found

2.ARC开启与禁止

第一个错误解决方法如下:

支持libxml2

TARGETS -> Build Settings -> Linking -> Other Linker Flags,设置“-lxml2”

iOS开发笔记 基于wsdl2objc调用asp.net WebService

TARGETS -> Build Settings -> Search Paths-> Header Search Paths,设置“/usr/include/libxml2”

iOS开发笔记 基于wsdl2objc调用asp.net WebService

TARGETS -> Build Settings -> Apple LLVM5.0-Language-Objective C> Objective-C Automatic Reference Counting,设置“No”

iOS开发笔记 基于wsdl2objc调用asp.net WebService

 第二个错误解决方法:

TARGETS -> Build Settings ->All 搜索"compiler"

Apple LLVM 5.0- Custom CompilerFlags OtherWaning Flags 设置"-Wall"

iOS开发笔记 基于wsdl2objc调用asp.net WebService

打开Xcode的自动转换工具

iOS开发笔记 基于wsdl2objc调用asp.net WebService

iOS开发笔记 基于wsdl2objc调用asp.net WebService

错误解决后,项目就可以完整的运行了,在第一个错误当中我花的时间有些多,

如果你在做的过程当中遇到iOS开发笔记 基于wsdl2objc调用asp.net WebService这个错误

请重新尝试再做看上面二个错误的解决方法,在第二个错误记得一次性转换ARC

在项目当中还会用到手动设置ARC

手动ARC设置方法如下:

1.在Compiler Flags一列加上-fno-objc-arc就表示禁止这个.m文件的ARC

2.在Compiler Flags一列加上-fobjc-arc就表示开启这个.m文件的ARC

参考资料:http://blog.csdn.net/a283127993/article/details/11082179

http://blog.csdn.net/q199109106q/article/details/8565403

5. IOS客户端解析xml,json数据

接下来详细说明如何解析xml,json,往往遇到问题我就花了就是整整一天时间来做

5.1 IOS客户端解析xml无参数据

代码如下:

-(void)getXml{
NSMutableArray *result;
ServiceSoap12Bingding *binding =[Service ServiceSoap];
Service_Course *request = [[Service_Course alloc] init]; ServiceSoap12BindingResponse *response = [binding CourseUsingParameters:request];
for(id mine in response.bodyParts){
if([mine isKindOfClass:[Service_CourseResponse class]])
{
[request release];
result = [mine CourseResult].CourseEntity; }
for(Service_CourseEntity *t in result){ NSLog(@"ID:%d ParentID:%d CourseName:%@ CoursePPT:%@ CourseVidio:%@",[t.CourseID intvalue],
[t.ParentID intvalue],t.CourseName,t.CoursePPT,t.CourseVidio
);
} } }

5.2 IOS客户端解析xml有参数数据

-(void)getXml2{
NSMutableArray *result;
ServiceSoap12Bingding *binding =[Service ServiceSoap];
Service_ProblemPaper *request = [[Service_ProblemPaper alloc] init];
request.prkid=@""; ServiceSoap12BindingResponse *response = [binding ProblemPaperUsingParameters:request];
for(id mine in response.bodyParts){
if([mine isKindOfClass:[Service_ProblemPaperResponse class]])
{
[request release];
result = [mine ProblemPaperResult].ProblemPaperEntity; }
for(Service_CourseEntity *t in result){ NSLog(@"PPID:%d],
[t.PPID intvalue]);
} }

代码如下:

5.3 IOS客户端解析json有参数据

代码如下:

-(void)getJson{
NSMutableArray *result;
NSData*data;
ServiceSoap12Bingding *binding =[Service ServiceSoap];
Service_JsonProblemPaper2 *request = [[Service_JsonProblemPaper2 alloc] init];
request.prkid=@""; ServiceSoap12BindingResponse *response = [binding JsonProblemPaper2UsingParameters:request];
for(id mine in response.bodyParts){
if([mine isKindOfClass:[Service_JsonProblemPaper2Response class]])
{
[request release];
result = [mine JsonProblemPaper2Result] ;
data= [result dataUsingEncoding:NSUTF8StringEncoding]; NSLog(@"data:%@",data);
NSDictionary *dict =[NSjSONSerialization JSONbjectWithData:data options:NSJSONReadingAllowFragmentS error:nil];
if(dict == nil)
{
return ;
}
else{
for(NSString *ds in dict)
{
NSLog(@"json%@",[ds objectForKey:@"Name"]);
}
}
} }

在这里我只对解析json有参数据说明,在这里我遇到不少问题,花的时间挺多的,

IOS客户端解析xml有参数数据,IOS客户端解析xml有参数数据

参考代码就可以实现,在解析json有参数据,遇到了几个问题,

就几行代码也花了好久,断断续续抽出时间做,最后才完成,下面是如何将NSString

最后完整的放入NSDictionary,并且取出相应的键值,result是返回类型的数据

将NSString转化为NSData

[result dataUsingEncoding:NSUTF8StringEncoding];

将result类型的数据,转成UTF8的数据

首先我们将result类型的数据,转成UTF8的数据

iOS开发笔记 基于wsdl2objc调用asp.net WebService

将JSON串转化为字典

苹果引入了一个解析JSON串的NSJSONSerialization类。
通过该类,我们可以完成JSON数据与NSDictionary和NSArray之间的转化
iOS开发笔记 基于wsdl2objc调用asp.net WebService

开始的时候想将返回的NSString数据转化为NSDictionary即NSString-NSDictionary返回的数据为null

所以采用NSString-NSData-NSDictionary最后成功解决数据为null问题,数据成功拿到Name属性值和其他属性值

在这里我只打印Name属性值

iOS开发笔记 基于wsdl2objc调用asp.net WebService

6.总结

该博文面向初学者,大牛请不要喷。写到这里,又复习了好多知识,遇到之前没发现的错误,但是耐心下来,问题总会解决,

 WebService和客户端源码有需要的话可以留下邮箱,既然来了,对你有帮助,推荐支持一下呗!

http://www.cnblogs.com/linmingjun/p/4382565.html 作者

iOS开发笔记 基于wsdl2objc调用asp.net WebService的更多相关文章

  1. IOS开发笔记 - 基于wsdl2objc调用webservice

    为了方便在ios下调用webserivce,找来了wsdl2objc这样一个开源的框架来解析webservice方便在ios下引用. 下面做个小例子. 1.首先是用Asp.net搭建一个测试的webs ...

  2. iOS开发笔记--什么时候调用layoutSubviews

    iOS开发笔记--什么时候调用layoutSubviews 分类: iOS2014-04-22 16:15 610人阅读 评论(0) 收藏 举报 今天在写程序时候遇见layoutSubviews触发时 ...

  3. IOS开发笔记 - 基于SDWebImage的网络图片加载处理

    前言: 在IOS下通过URL读一张网络图片并不像Asp.net那样可以直接把图片路径放到图片路径的位置就ok, 而是需要我们通过一段类似流的方式去加载网络图片,接着才能把图片放入图片路径显示. 这里找 ...

  4. iOS开发笔记7:Text、UI交互细节、两个动画效果等

    Text主要总结UILabel.UITextField.UITextView.UIMenuController以及UIWebView/WKWebView相关的一些问题. UI细节主要总结界面交互开发中 ...

  5. iOS开发笔记-两种单例模式的写法

    iOS开发笔记-两种单例模式的写法   单例模式是开发中最常用的写法之一,iOS的单例模式有两种官方写法,如下: 不使用GCD #import "ServiceManager.h" ...

  6. IOS开发笔记(4)数据离线缓存与读取

    IOS开发笔记(4)数据离线缓存与读取 分类: IOS学习2012-12-06 16:30 7082人阅读 评论(0) 收藏 举报 iosiOSIOS 方法一:一般将服务器第一次返回的数据保存在沙盒里 ...

  7. IOS开发笔记 IOS如何访问通讯录

    IOS开发笔记  IOS如何访问通讯录 其实我是反对这类的需求,你说你读我的隐私,我肯定不愿意的. 幸好ios6.0 以后给了个权限控制.当打开app的时候你可以选择拒绝. 实现方法: [plain] ...

  8. 【Swift】iOS开发笔记(二)

    前言 这个系列主要是一些开发中遇到的坑记录分享,有助于初学者跨过这些坑,攒够 7 条发一篇. 声明  欢迎转载,但请保留文章原始出处:)  博客园:http://www.cnblogs.com 农民伯 ...

  9. 菜鸟手下的iOS开发笔记&lpar;swift&rpar;

    在阳春4月的一天晨会上,有一个老板和蔼的对他的一个菜鸟手下说:“你既然会Android,那你能不能开发iOS?” 不是说好的要外包的吗?内心跌宕,但是表面淡定的菜鸟手下弱弱的回道:“可以试试”. 第二 ...

随机推荐

  1. Windows phone重写返回键

    protected override void OnBackKeyPress(System.ComponentModel.CancelEventArgs e) {//需要设置这个属性 e.Cancel ...

  2. &lbrack;zhuan&rsqb; linux 下 wxWidgets 安装,编译

      http://blog.csdn.net/yuzhenxiong0823/article/details/7727133 wxWidgets在Linux下有wxGTK和wxX11供使用,各需要GT ...

  3. jQuery获取一般处理程序&lpar;ashx&rpar;的JSON数据

    昨天有在开发的软件生产线生产流程,RFID扫描IC卡的数据,当中有用到jQuery获取一般处理程序(ashx)的JSON数据.今有把它写成一个小例子,望需要的网友能参考. 在网站中,创建一个一般应用程 ...

  4. 每天进步一点--c&num;基础巩固&comma;事件、委托

    要想技术有所提高,就是把有些问题真正的弄懂弄明白,我从事C#开发两年了,一直对事件委托等概念一知半解,有时候博客园上看看别的大牛的文章,看看懂了就过去了,时间长了又忘了,真正理解还是要自己动手弄些例子 ...

  5. 机器学习在 IT 运维管理中的必要性!

    机器学习技术在监控工具中的应用已经成为 IT 运维与 DevOps 团队的一大热点话题.尽管相关的使用案例很多,对 IT 团队而已真正的「杀手级应用」是机器学习如何提高实时事件管理能力,从而帮助较大规 ...

  6. C&num;自定义控件在添加引用后不显示在工具箱的解决方法

    先说一些背景: 在开发C#项目时,发现很多控件存在复用的情况,控件的属性都是要设置成一样的,我就想,能不能设置一个类来存放这个控件,这样我每次用的时候直接加一些特殊的操作就可以了,不需要再次设置控件属 ...

  7. MySql数据库连接池

    1.传统链接(如下为示意图) 注意: (1).传统方式找DriverManager要连接,数目是有限的. (2).传统方式的close(),并没有将Connection重用,只是切断应用程序和数据库的 ...

  8. windows azure Vm、cloud service、web application 如何选择可用的服务

    windows azure 的web应用和虚拟机都经常用.我们经常把我们的网站部署上去.一般选择web应用或者开一个虚拟机.开一个虚拟机就会按照虚拟机的使用时间进行计费. 那么我们选择web部署在哪里 ...

  9. Linux指令--rcp,scp

    rcp代表"remote file copy"(远程文件拷贝).该命令用于在计算机之间拷贝文件.rcp命令有两种格式.第一种格式用于文件到文件的拷贝:第二种格式用于把文件或目录拷贝 ...

  10. java读取properties文件时候要注意的地方

    java读取properties文件时,一定要注意properties里面后面出现的空格! 比如:filepath = /home/cps/ 我找了半天,系统一直提示,没有这个路径,可是确实是存在的, ...