先下載待會要用到的工具 WSDL2ObjC-0.6.zip WSDL2ObjC-0.7-pre1.ziphtml
我用的是WSDL2ObjC-0.6.zipweb
建立WebService服務項目後先在Web.config添加節點,設置WebService遠程調試訪問,不然會出現:sql
「測試窗體只能用於來自本地計算機的請求」。數據庫
<webServices> <protocols> <add name="HttpSoap" /> <add name="HttpPost" /> <add name="HttpGet" /> <add name="Documentation" /> </protocols> </webServices>
建立類庫添加Model實體類json
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; } } }
事先作好Model實體類的生成dll文件,直接添加引用至bin目錄下windows
在項目當中添加一個數據庫操做類DBOperation.cs服務器
接下來咱們打開Service.cs文件。asp.net
service.cs代碼以下:ide
[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(0); model.PRKID = reader.GetInt32(1); model.PTID = reader.GetInt32(2); model.Name = reader.GetString(3); model.ProblemNum = reader.GetInt32(4); list.Add(model); } reader.Close(); cmd.Dispose(); } catch (Exception) { } return list; }
從service.cs代碼中能夠看到ProblemPaper方法前面 [WebMethod]指示web服務提供的方法
public方法可否被調用者訪問取決於這個方法是不是一個「WebMethod」,在編寫方法的時候注意
方法前面是否含有WebMethod
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[0].ToString()); list.Add(reader[1].ToString()); list.Add(reader[2].ToString()) ; list.Add(reader[3].ToString()); list.Add(reader[4].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
選擇應用程序池.Net v.2.0,切記,如在部署遇到問題能夠查閱其餘相關資料,在這裏
就很少詳細
4.IOS基於wsdl2objc調用asp.net WebService
4.1使用wsdl2objc工具
在官網上下載有2個版本,我用的是WSDL2ObjC-0.6.zip,
部署完畢後,打開wsdl2objc
Parse WSDL後稍等15秒左右出現Finish!查看導入目錄
將生成的全部文件放置在wsdl2objc文件夾
嘗試編譯出現錯誤以下:
解決方法:這裏有2個錯誤
1."libxml/tree.h" file not found
2.ARC開啓與禁止
第一個錯誤解決方法以下:
支持libxml2
TARGETS -> Build Settings -> Linking -> Other Linker Flags,設置「-lxml2」
TARGETS -> Build Settings -> Search Paths-> Header Search Paths,設置「/usr/include/libxml2」
TARGETS -> Build Settings -> Apple LLVM5.0-Language-Objective C> Objective-C Automatic Reference Counting,設置「No」
第二個錯誤解決方法:
TARGETS -> Build Settings ->All 搜索"compiler"
Apple LLVM 5.0- Custom CompilerFlags OtherWaning Flags 設置"-Wall"
打開Xcode的自動轉換工具
錯誤解決後,項目就能夠完整的運行了,在第一個錯誤當中我花的時間有些多,
若是你在作的過程中遇到這個錯誤
請從新嘗試再作看上面二個錯誤的解決方法,在第二個錯誤記得一次性轉換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 ); } } }
-(void)getXml2{ NSMutableArray *result; ServiceSoap12Bingding *binding =[Service ServiceSoap]; Service_ProblemPaper *request = [[Service_ProblemPaper alloc] init]; request.prkid=@"1"; 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]); } }
代碼以下:
代碼以下:
-(void)getJson{ NSMutableArray *result; NSData*data; ServiceSoap12Bingding *binding =[Service ServiceSoap]; Service_JsonProblemPaper2 *request = [[Service_JsonProblemPaper2 alloc] init]; request.prkid=@"1"; 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是返回類型的數據
[result dataUsingEncoding:NSUTF8StringEncoding];
將result類型的數據,轉成UTF8的數據
首先咱們將result類型的數據,轉成UTF8的數據
將JSON串轉化爲字典
開始的時候想將返回的NSString數據轉化爲NSDictionary即NSString-NSDictionary返回的數據爲null
因此採用NSString-NSData-NSDictionary最後成功解決數據爲null問題,數據成功拿到Name屬性值和其餘屬性值
在這裏我只打印Name屬性值
6.總結
該博文面向初學者,大牛請不要噴。寫到這裏,又複習了好多知識,遇到以前沒發現的錯誤,可是耐心下來,問題總會解決,
WebService和客戶端源碼有須要的話能夠留下郵箱,既然來了,對你有幫助,推薦支持一下唄!