日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IOS调用WCF提供的服务方法,但是方法的参数是WCF那边自定义的对象,这样有办法调用么,如果可以IOS应该怎么传参呢?请问有了解的么,...

發布時間:2024/9/20 编程问答 26 豆豆

最近做一個項目后端使用WCF接收Android手機拍照并帶其它參數保存到服務器里;剛好把最近學習的WCF利用上,本以為是個比較簡單的功能應該很好實現,沒想到其中碰到不少問題,在網上搜索很久一直沒有想到的解決方案,最后實現對數據流的分段寫入然后后端再來解析流實現的此功能;后端運用WCF中的REST來接收數據;REST還是比較簡單的知識,若是不懂可以簡單網上了解一下;下面我們先了解一些本次運用到的理論知識:

一:理論知識

由于低層協議特性限制,WCF的流模式只支持如下四種:1:BasicHttpBinding 2:NetTcpBinding 3:NetNamedPipeBinding 4:WebHttpBinding

1.設置TransferMode。它支持四種模式(Buffered、Streamed、StreamedRequest、StreamedResponse),請根據具體情況設置成三種Stream模式之一。

2.修改MaxReceivedMessageSize。該值默認大小為64k,因此,當傳輸數據大于64k時,則拋出CommunicationException異常。 ?

3.修改receiveTimeout 和sendTimeout。大數據傳送時間較長,需要修改這兩個值,以免傳輸超時。

二:解決問題

WCF如果使用Stream做為參數時只能唯一一個,不能有其它另外的參數,這個也是本次碰到要重點解決的一個問題;可是我們Android手機除的圖片還要有其它的參數,最后決定采用手機端把參數跟圖片都一起寫入Stream里面,后端WCF再來解析這個參數的流;

下面就是定義好Stream的格式,傳過來的Stream分成三部分: 參數信息長度??參數信息?? 圖片

1 參數信息長度(1字節):用于存放參數信息的長度(以字節為單位);

2 參數信息: 除圖片以外的參數,以JSON的形式存放如{"type":"jpg","EmployeeID":"12","TaskID":"13"}

3 圖片:圖片的字節

三:WCF編碼內容

1:我們首先定義一個WCF契約,由于我們運用REST(在命名空間ServiceModel.Web下面)契約IAndroidInfo內容如下,采用POST方式進行接收:

using System.ServiceModel; using System.Runtime.Serialization; using System.ServiceModel.Web; using System.IO;namespace Coreius.CEIMS.AndroidInterface {[ServiceContract]public interface IAndroidInfo{[WebInvoke(UriTemplate = "GpsUpFile", Method = "POST", BodyStyle = WebMessageBodyStyle.Wrapped, RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]bool GpsUpFile(Stream ImageContext);} }

2:根據契約我們定義服務的內容,接收一個流的參數內容,首先把這個Stream轉化成字節,然后根據我們先前約定好的內容獲得第一個字節的值,再根據此值定義我們另外三個參數的字節長度,再通過JSON轉換格式把它里面的三個參數值取出來,最后其它字節是存放一張手機拍的照片,把它存放在于們服務器D盤文件夾下

using System.Linq; using System.Text; using System.ServiceModel; using System.ServiceModel.Web; using System.IO; using Newtonsoft.Json;namespace Coreius.CEIMS.AndroidService {public class AndroidInfoService:IAndroidInfo{public bool GpsUpFile(Stream ImageContext){byte[] m_Bytes = ReadToEnd(ImageContext);int len = (int)m_Bytes[0];byte[] data = m_Bytes.Skip(1).Take(len).ToArray();string Jsonstr = System.Text.Encoding.Default.GetString(data);JsonModel item = JsonConvert.DeserializeObject<JsonModel>(Jsonstr);string ImageType=item.type;string EmployeeID=item.EmployeeID;string TaskID=item.TaskID;byte[] Imagedata = m_Bytes.Skip(1 + len).ToArray();string DiskName = "d:";string FileAddress = "\\UpLoad\\";string LocationAddress = DiskName + FileAddress;if (!DirFileHelper.IsExistDirectory(LocationAddress)){DirFileHelper.CreateDirectory(LocationAddress);}string ImageName = DateTime.Now.ToString("yyyyMMddhhmmss.") + ImageType;string ImagePath = LocationAddress + ImageName;if (!File.Exists(ImagePath)){try{System.IO.File.WriteAllBytes(ImagePath, Imagedata);ImageContext.Close();return true;}catch{return false;}}else{return false;}}} }

上面的代碼用到幾個方法,比如把流轉化成字節、把JSON轉化成實現等,代碼如下:

public byte[] ReadToEnd(System.IO.Stream stream){long originalPosition = 0;if (stream.CanSeek){originalPosition = stream.Position;stream.Position = 0;}try{byte[] readBuffer = new byte[4096];int totalBytesRead = 0;int bytesRead;while ((bytesRead = stream.Read(readBuffer, totalBytesRead, readBuffer.Length - totalBytesRead)) > 0){totalBytesRead += bytesRead;if (totalBytesRead == readBuffer.Length){int nextByte = stream.ReadByte();if (nextByte != -1){byte[] temp = new byte[readBuffer.Length * 2];Buffer.BlockCopy(readBuffer, 0, temp, 0, readBuffer.Length);Buffer.SetByte(temp, totalBytesRead, (byte)nextByte);readBuffer = temp;totalBytesRead++;}}}byte[] buffer = readBuffer;if (readBuffer.Length != totalBytesRead){buffer = new byte[totalBytesRead];Buffer.BlockCopy(readBuffer, 0, buffer, 0, totalBytesRead);}return buffer;}finally{if (stream.CanSeek){stream.Position = originalPosition;}}}public class JsonModel{public string type { get; set; }public string EmployeeID { get; set; }public string TaskID { get; set; }}

3:新建一個文本,然后修改其后綴名為.svc,作為我們發布服務(宿主為IIS)讓Android手機調用, 然后把下面的代碼寫入

<%@ ServiceHost Language="C#" Debug="true" Service="Coreius.CEIMS.AndroidService.AndroidInfoService" %>

修改Web.config里面的內容:

<?xml version="1.0" encoding="utf-8"?> <configuration><appSettings><add key="ConnectionString" value="server=127.0.0.1;database=Coreius;uid=sa;pwd=admin"/></appSettings><system.web><compilation debug="true" targetFramework="4.0" /></system.web><system.serviceModel><behaviors><endpointBehaviors><behavior name="webHttp"><webHttp helpEnabled="true"/></behavior></endpointBehaviors><serviceBehaviors><behavior name="MapConfigBehavior"><!-- 為避免泄漏元數據信息,請在部署前將以下值設置為 false 并刪除上面的元數據終結點 --><serviceMetadata httpGetEnabled="true"/><!-- 要接收故障異常詳細信息以進行調試,請將以下值設置為 true。在部署前設置為 false 以避免泄漏異常信息 --><serviceDebug includeExceptionDetailInFaults="true"/><dataContractSerializer maxItemsInObjectGraph="2147483647"/></behavior></serviceBehaviors></behaviors><bindings><webHttpBinding><binding name="webHttpBindConfig" receiveTimeout="00:30:00" sendTimeout="00:30:00" maxReceivedMessageSize="104857600" transferMode="Streamed"><readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"/><security mode="None"></security></binding></webHttpBinding></bindings><services><service name="Coreius.CEIMS.AndroidService.AndroidInfoService" behaviorConfiguration="MapConfigBehavior"><endpoint binding="webHttpBinding" contract="Coreius.CEIMS.AndroidInterface.IAndroidInfo" bindingConfiguration="webHttpBindConfig" behaviorConfiguration="webHttp"/> </service></services></system.serviceModel> </configuration>

此處有些要注意的地方:

(1):此處采用的是webHttpBinding 所以一定要設置behaviorConfiguration才會有效果,其中helpEnabled="true"則是為實現可以在發布可以查看幫助信息????

<behavior name="webHttp"><webHttp helpEnabled="true"/></behavior>

(2):為了實現上傳大文件所以我們要如下設置最大值,其中security是設置訪問服務的認證,此處是把它設置成為不認證,transferMode就是設置運用流的模式

<webHttpBinding><binding name="webHttpBindConfig" receiveTimeout="00:30:00" sendTimeout="00:30:00" maxReceivedMessageSize="104857600" transferMode="Streamed"><readerQuotas maxStringContentLength="2147483647" maxArrayLength="2147483647"/><security mode="None"></security></binding></webHttpBinding>

4:編寫完上面的代碼后就可以服務器IIS上部署這個WCF服務:

四:Android編碼

由于Android手機端的代碼是另外一個朋友編寫,所以就把大體的代碼貼出來,大體的原理就是把參數跟圖片寫入流,然后調用部署好的WCF服務

代碼一:因為服務器不是公用的,所以下面的IP我就隨便修改的一個;

private void toUploadFile(File file) throws FileNotFoundException {String result = null;requestTime= 0;int res = 0;long requestTime = System.currentTimeMillis();long responseTime = 0;//封裝參數信息JSONObject jsonObject = new JSONObject();try {jsonObject.put("EmployeeID", MainActivity.guid);jsonObject.put("TaskID", "e52df9b4-ee3b-46c5-8387-329b76356641");String[] type = file.getName().split("\\.");jsonObject.put("type", type[type.length-1]);} catch (JSONException e) {// TODO Auto-generated catch blocke.printStackTrace();}/**上傳文件*/HttpParams httpParameters = new BasicHttpParams();HttpConnectionParams.setConnectionTimeout(httpParameters, 1000*30);HttpConnectionParams.setSoTimeout(httpParameters, 1000*30);HttpConnectionParams.setTcpNoDelay(httpParameters, true);String path = PictureUtil.zipNewImage(file); //壓縮文件后返回的文件路徑byte[] bytes = null;InputStream is;File myfile = new File(path);try {is = new FileInputStream(path);bytes = new byte[(int) myfile.length()];int len = 0;int curLen = 0;while ((len = is.read(bytes)) != -1) {curLen += len;is.read(bytes);}is.close();} catch (FileNotFoundException e1) {// TODO Auto-generated catch blocke1.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}byte[] updata = GpsImagePackage.getPacket(jsonObject.toString(), bytes); //參數與文件封裝成單個數據包HttpClient httpClient = new DefaultHttpClient(httpParameters);HttpPost httpPost = new HttpPost(MyUrl.upload_file);HttpResponse httpResponse;//單個文件流上傳InputStream input = new ByteArrayInputStream( updata );InputStreamEntity reqEntity;reqEntity = new InputStreamEntity(input, -1);reqEntity.setContentType("binary/octet-stream");reqEntity.setChunked(true);httpPost.setEntity(reqEntity);try {httpResponse = httpClient.execute(httpPost);responseTime = System.currentTimeMillis();this.requestTime = (int) ((responseTime-requestTime)/1000);res = httpResponse.getStatusLine().getStatusCode();if (httpResponse.getStatusLine().getStatusCode() ==200) {Log.e(TAG, "request success");Log.e(TAG, "result : " + result);return;} else {Log.e(TAG, "request error");sendMessage(UPLOAD_SERVER_ERROR_CODE,"上傳失敗:code=" + res);return;}} catch (ClientProtocolException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}package com.anthony.util; /*** 服務器端接口* @author YWJ**/ public class MyUrl {public static String upload_GPS = "http://122.199.19.23:8088/AndroidInfoService.svc/SetGpsInfo"; }

代碼二:

package com.anthony.util;public class GpsImagePackage {public GpsImagePackage() {// TODO Auto-generated constructor stub}//封裝字節數組與參數public static byte[] getPacket(String json,byte[] image){byte[] jsonb = json.getBytes();int length = image.length + jsonb.length;System.out.println(image.length +" "+ jsonb.length);byte[] bytes = new byte[length+1];byte[] lengthb = InttoByteArray(jsonb.length, 1);System.arraycopy(lengthb, 0, bytes, 0, 1);System.arraycopy(jsonb, 0, bytes, 1, jsonb.length);System.arraycopy(image, 0, bytes, 1+jsonb.length, image.length);return bytes;}//將int轉換為字節數組public static byte[] InttoByteArray(int iSource, int iArrayLen) {byte[] bLocalArr = new byte[iArrayLen];for ( int i = 0; (i < 4) && (i < iArrayLen); i++) {bLocalArr[i] = (byte)( iSource>>8*i & 0xFF );}return bLocalArr;}// 將byte數組bRefArr轉為一個整數,字節數組的低位是整型的低字節位public static int BytestoInt(byte[] bRefArr) {int iOutcome = 0;byte bLoop;for ( int i =0; i<bRefArr.length ; i++) {bLoop = bRefArr[i];iOutcome+= (bLoop & 0xFF) << (8 * i);}return iOutcome;} }

五:運行效果:

如果,您認為閱讀這篇博客讓您有些收獲,不妨點擊一下右下角的【推薦】按鈕。? 因為,我的寫作熱情也離不開您的肯定支持。

總結

以上是生活随笔為你收集整理的IOS调用WCF提供的服务方法,但是方法的参数是WCF那边自定义的对象,这样有办法调用么,如果可以IOS应该怎么传参呢?请问有了解的么,...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲人和日本人hd | 精品成人av | 国产精品久久综合视频 | 看国产一级片 | 不卡一区二区在线视频 | 日本三级中文字幕 | 成人一区二区三区仙踪林 | 国产小视频在线看 | 久久影院一区 | 亚洲av无码一区二区三区在线观看 | 日韩美女免费线视频 | 黄瓜视频91 | 国产91九色 | 欧美破处大片 | jizz日本18| 成人乱码一区二区三区 | 香蕉视频在线免费看 | 国产黄色免费在线观看 | 国产性生活毛片 | 天天色天天色天天色 | 午夜激情视频在线观看 | 亚洲欧洲在线视频 | 亚洲一| 天天干夜夜拍 | 日本乱淫视频 | 精品国产一区二区三区久久狼黑人 | aa片在线观看视频在线播放 | 成人影视在线看 | 老司机午夜视频 | 草草在线影院 | 丁香婷婷久久久综合精品国产 | 97精品人人a片免费看 | mm131亚洲精品 | 99热这里只有精品在线观看 | 久久免费成人 | 日日干夜 | 亚洲美女在线观看 | 伊人影院综合 | 91av视频播放| 污夜影院 | 欧美日本韩国一区二区 | 久久久久麻豆 | 91精品啪在线观看国产线免费 | 就要操就要日 | 日韩激情小视频 | 日本人妖在线 | 亚洲精品二区三区 | 亚洲天堂手机版 | 色婷婷色婷婷 | 国产一级免费观看 | 午夜两性网| 国产又粗又猛又爽又黄 | 亚洲AV蜜桃永久无码精品性色 | 重口变态虐黄网站 | jizz免费视频 | 欧美精品第二页 | 思思在线视频 | 人人射人人 | 欧美成人精品欧美一 | 一区二区三区网站 | 色综合中文 | 国产欧美自拍 | 涩涩视频在线免费看 | 无码人妻一区二区三区精品视频 | 2017日日夜夜 | 操批网站 | 欧美处女| 公侵犯一区二区三区四区中文字幕 | 欧美三级又粗又硬 | 亚洲天堂2013 | 51福利视频| 噜噜狠狠狠狠综合久久 | 国产成人a亚洲精v品无码 | aaaaaav| 色在线免费| 一起草国产 | 国产精品777777| 男女交性视频 | 偷拍视频一区二区 | 日日操夜夜撸 | 久久国产片 | 两性免费视频 | 亚洲人交配 | 中文字幕一区二区在线播放 | 成人拍拍拍 | 黄色三级免费网站 | 国产偷啪 | 国产在线精 | 日韩xx视频 | 99黄色网 | 男女视频在线观看免费 | 青青成人在线 | 成人免费毛片男人用品 | 国产第一亚洲 | 日本少妇xxxx动漫 | 亚洲最大福利视频 | 亚洲高清av在线 | 91系列在线观看 | 中文字幕h |