从windows mobile 6.5紧凑框架调用restful webservice

时间:2013-10-25 19:33:41

标签: .net web-services rest windows-mobile compact-framework

我正在尝试从Windows Mobile 6.5紧凑框架客户端调用服务。这给了我异常“无法从传输连接中读取数据”。

我使用的模拟器是Windows mobile 6专业模拟器。 Dotnet框架3.模拟器连接到互联网。我可以从互联网上打开网页。如果创建C#Windows控制台应用程序,相同的代码运行正常。请指导。

        WebRequest Webrequest;
        HttpWebResponse response=null;

        Webrequest = WebRequest.Create("http://api.geonames.org/postalCodeSearchJSON?postalcode=9011&maxRows=10&username=demo");

        Webrequest.Method = "GET";
        Webrequest.ContentType = "html/xml";
        try
        {
            response = (HttpWebResponse)Webrequest.GetResponse();
        }catch(Exception exc){
            ShowErrorMessage("Ex : " + exc.Message);

            return;
        }

        Stream streamResponse = response.GetResponseStream();
        StreamReader streamReader = new StreamReader(streamResponse);
        string responseStr = streamReader.ReadToEnd();

2 个答案:

答案 0 :(得分:0)

我不知道你的代码到底出了什么问题。可能您必须在发出Web请求之前设置一些属性。这是我用于从Web服务获取时区信息的片段:

    /// <summary>
    /// This will call the webservice asynchronousely
    /// the call will immediately return
    /// The answer on the request is published to all event subscribers
    /// </summary>
    /// <param name="lat">decimal input for geographic Latitude</param>
    /// <param name="lng">decimal input for geographic Longitude</param>
    public void startRequest(string lat, string lng)
    {
        //tzInfos pTZinfos = new tzInfos();
        string myURL = @"http://ws.geonames.org/" + _webMethodName;
        //HttpWebRequest webRequest = (HttpWebRequest)HttpWebRequest.Create(myURL);
        //HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse();
        //string wsdl = "";
        _webServiceURI = myURL;
        try
        {
            _httpRequest = (HttpWebRequest)HttpWebRequest.Create(this._webServiceURI + "?lat=" + lat + "&lng=" + lng); // "?WSDL");
            _httpRequest.Method = "POST";
            _httpRequest.KeepAlive = false;
            _httpRequest.ContentType = "application/x-www-form-urlencoded";
            //httpRequest.ContentLength = requestData.Length;
            _httpRequest.Timeout = 30000;

            //async call
            IAsyncResult myAsycnCall = this._httpRequest.BeginGetResponse(new AsyncCallback(this.ResponseReceivedHandler), null);                
        }
        catch (WebException wx)
        {
            System.Diagnostics.Debug.WriteLine("Exception: " + wx.Message);
        }
        catch (Exception wx)
        {
            System.Diagnostics.Debug.WriteLine("Exception: " + wx.Message);
        }
    }
    /// <summary>
    /// This is the async method for the response to be get from the web service
    /// </summary>
    /// <param name="result"></param>
    private void ResponseReceivedHandler(IAsyncResult result)
    {
        string wsdl = "";
        geonamesTZfields pTZinfos = new geonamesTZfields();
        geonamesEventArgs tArg = new geonamesEventArgs();
        try
        {
            HttpWebResponse response = (HttpWebResponse)this._httpRequest.EndGetResponse(result);

            System.IO.Stream streamResponse = response.GetResponseStream();
            System.IO.StreamReader streamRead = new System.IO.StreamReader(streamResponse);
            wsdl = streamRead.ReadToEnd();
            System.Diagnostics.Debug.WriteLine("Response: " + wsdl);

            // Close the stream object
            streamResponse.Close();
            streamRead.Close();

            // Release the HttpWebResponse
            response.Close();
            if (wsdl.Length > 0)
            {
                StringBuilder sb = new StringBuilder(wsdl);
                pTZinfos.strCountryCode = xml_helper.xml_helper.getStrSetting(sb, "countryCode");
                pTZinfos.strCountryName = xml_helper.xml_helper.getStrSetting(sb, "countryName");
                pTZinfos.strTimezoneID = xml_helper.xml_helper.getStrSetting(sb, "timezoneId");
                pTZinfos.gmtOffset = xml_helper.xml_helper.getDecimalSetting(sb, "gmtOffset");
                pTZinfos.rawOffset = xml_helper.xml_helper.getDecimalSetting(sb, "rawOffset");
                pTZinfos.dstOffset = xml_helper.xml_helper.getDecimalSetting(sb, "dstOffset");
                pTZinfos.tzTime = xml_helper.xml_helper.getDateTimeSetting(sb, "time");
            }
            _tzFields = pTZinfos;
            //fire the event
            tArg.m_myEventArgumentdata = pTZinfos;
            tArg.m_myEventArgumentdata.DataIsValid = true;
            tArg.m_myEventArgumentdata.strLastError = "no error";
        }
        catch (WebException wx)
        {
            tArg.m_myEventArgumentdata.DataIsValid = false;
            tArg.m_myEventArgumentdata.strLastError = wx.Message;
        }
        catch (Exception ex)
        {
            tArg.m_myEventArgumentdata.DataIsValid = false;
            tArg.m_myEventArgumentdata.strLastError = ex.Message;
        }
        finally
        {
            this.onDataReceived(tArg); //notify all subscribers of new data arrived
        }
    }

你看我明确地设置了一些属性:                 _httpRequest.Method =“POST”;                 _httpRequest.KeepAlive = false;                 _httpRequest.ContentType =“application / x-www-form-urlencoded”;                 //httpRequest.ContentLength = requestData.Length;                 _httpRequest.Timeout = 30000; 我的文章可在http://www.hjgode.de/wp/2010/03/04/using-ws-geonames-org-timezone-webservice-without-wsdl/处找到完整的代码。您可以使用它并更改您的Web请求并使用异步调用。

您也可以尝试在设备上的Internet Explorer Mobile中轻松打开网页:http://api.geonames.org/postalCodeSearchJSON?postalcode=9011&maxRows=10&username=demo。你应该得到答案:

{“postalCodes”:[{“adminCode3”:“3203”,“adminName2”:“Wahlkreis St. Gallen”,“adminName3”:“圣加仑”,“adminCode2”:“1721”,“adminCode1” :“SG”,“postalCode”:“9011”,“countryCode”:“CH”,“lng”:9.399845287638328,“placeName”:“St.Gallen”,“lat”:47.414775553450646,“adminName1”:“Kanton St .Gallen“},{”adminCode1“:”GS“,”postalCode“:”9011“,”countryCode“:”HU“,”lng“:17.781944437499998,”placeName“:”Győr“,”lat“:47.607638900000005, “adminName1”: “杰尔 - 莫松 - 肖普朗”},{ “adminName2”: “特罗姆瑟”, “adminCode2”: “1902”, “adminCode1”: “19”, “POSTALCODE”: “9011”, “COUNTRYCODE”: “NO”, “LNG”:18.95508, “地名”: “特罗姆瑟”, “ISO3166-2”: “10”, “LAT”:69.6489 “adminName1”: “特罗姆斯”},{ “POSTALCODE”:“L -9011" , “COUNTRYCODE”: “LU”, “LNG”:6.1041667, “地名”: “的Ettelbruck”, “LAT”:49.8475},{ “adminCode1”: “Z”, “POSTALCODE”: “9011”, “countryCode”:“AR”,“lng”: - 67.5333333,“placeName”:“CALETA OLIVIA”,“lat”: - 46.4333333,“adminName1”:“SANTA CRUZ”},{“adminCode1”:“Z”, “postalCode”:“9011”,“countryCode”:“AR”,“lng”: - 67.5333333,“placeName”:“EL MANGRULLO”,“lat”: - 46.4 333333,“adminName1”:“SANTA CRUZ”},{“adminCode1”:“Z”,“postalCode”:“9011”,“countryCode”:“AR”,“lng”: - 67.5333333,“placeName”:“CAÑADON ESTHER“,”lat“: - 46.4333333,”adminName1“:”SANTA CRUZ“},{”adminCode1“:”Z“,”postalCode“:”9011“,”countryCode“:”AR“,”lng“: - 67.5333333,“placeName”:“BAHI​​A LANGARA”,“lat”: - 46.4333333,“adminName1”:“SANTA CRUZ”},{“postalCode”:“9011”,“countryCode”:“NZ”,“lng”:170.47198 “地名”: “莫宁”, “LAT”: - 45.87922},{ “POSTALCODE”: “9011”, “COUNTRYCODE”: “PH”, “LNG”:124.7325, “地名”: “Balinguan”,“LAT “:9.050317457142857}]}

如果Internet Explorer Mobile中没有,则表明您的连接设置不正确。对于WMDC连接设置,请参阅“此计算机连接到”。从Internet切换到自动可能会有所帮助。我假设你已经停靠了你使用的模拟器,WMDC或ActiveSync显示了与模拟器的连接。

答案 1 :(得分:0)

class ServiceConnection
{
    public string Url = "";

    private string postXml;

    public delegate void OnServerEndResponse(string response, int statusCode);
    public event OnServerEndResponse OnEndResponse;
    public ServiceConnection(string serviceName, string userName, string pwd)


    public void SendRequest(string requestXml)
    {
        postXml = requestXml;
        StartWebService();
    }

    public void StartWebService()
    {
        WebRequest request = WebRequest.Create(Url);
        request.Method = "GET";
        byte[] auth = Encoding.UTF8.GetBytes(UserName + ":" + Pwd);
        request.Headers["Authorization"] = "Basic " + System.Convert.ToBase64String(auth);
        request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request);
    }

    void GetResponseCallback(IAsyncResult asynchronousResult)
    {
        HttpWebResponse response = null;
        HttpWebRequest webRequest = null;

        try
        {
            webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
            response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
            Stream streamResponse = response.GetResponseStream();
            StreamReader streamReader = new StreamReader(streamResponse);
            StringBuilder sb = new StringBuilder();
            sb.Append(streamReader.ReadToEnd());
            //string serverResponse = streamReader.ReadToEnd();
            streamResponse.Close();
            streamReader.Close();
            response.Close();


            OnEndResponse(sb.ToString(), Convert.ToInt32(response.StatusCode));
        }
        catch (Exception ex)
        {
            if (ex.Message == "The remote server returned an error: (401) Unauthorized.")
                OnEndResponse(ex.Message, 401);
            else if (ex.Message == "Unable to connect to the remote server")
                OnEndResponse(ex.Message, 4);
            else if (ex.Message == "Could not establish connection to network.")
                OnEndResponse(ex.Message, 10000);
            else
                OnEndResponse("Error in network", 10001);
        }
    }
}