/// <summary>
        /// POST请求
        /// </summary>
        /// <param name="relativeUrl">相对地址</param>
        /// <param name="data">IT类型数据</param>
        /// <param name="parameters">参数</param>
        /// <returns>OT类型数据</returns>
        public OT Post(string relativeUrl, IT data, IDictionary <string, ICollection <string> > parameters)
        {
            var u = new UriBuilder(ServerUrl);

            u.Path += relativeUrl;
            u.Query = parameters.BuildParams();

            var request = WebRequest.Create(u.Uri) as HttpWebRequest;

            if (!string.IsNullOrEmpty(ContentType))
            {
                request.ContentType = ContentType;
            }

            request.Method    = "POST";
            request.KeepAlive = KeepAlive;

            if (ReadWriteTimeout > 0)
            {
                request.ReadWriteTimeout = ReadWriteTimeout;
            }

            if (Timeout > 0)
            {
                request.Timeout = Timeout;
            }

            Stream requestStream = null;

            try
            {
                requestStream = request.GetRequestStream();

                if (data != null)
                {
                    RequestCodecFactory.Create().Marshal(data, requestStream);
                }
            }
            finally
            {
                if (requestStream != null)
                {
                    requestStream.Close();
                }
            }

            WebResponse response = null;
            Stream      stream   = null;

            try
            {
                response = request.GetResponse();
                stream   = response.GetResponseStream();

                return((OT)ResponseCodecFactory.Create().Unmarshal(stream));
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                }
                if (response != null)
                {
                    response.Close();
                }
            }
        }
Beispiel #2
0
        /// <summary>
        /// GET请求
        /// </summary>
        /// <param name="relativeUrl">相对地址</param>
        /// <param name="parameters">参数</param>
        /// <returns>T类型数据</returns>
        public T Get(string relativeUrl, IDictionary <string, ICollection <string> > parameters)
        {
            var u = new UriBuilder(ServerUrl);

            u.Path += relativeUrl;

            var request = WebRequest.Create(u.Uri) as HttpWebRequest;
            var bytes   = System.Text.Encoding.UTF8.GetBytes(parameters.BuildParams());

            request.Method        = "POST";
            request.ContentType   = "application/x-www-form-urlencoded";
            request.ContentLength = bytes.Length;
            request.KeepAlive     = KeepAlive;

            if (ReadWriteTimeout > 0)
            {
                request.ReadWriteTimeout = ReadWriteTimeout;
            }

            if (Timeout > 0)
            {
                request.Timeout = Timeout;
            }

            var cached = Cache[u.Uri.ToString()];

            if (cached != null)
            {
                request.Headers.Add(HttpRequestHeader.IfNoneMatch, cached.ETag);
            }

            using (var requestStream = request.GetRequestStream())
            {
                requestStream.Write(bytes, 0, bytes.Length);
            }

            WebResponse response = null;
            Stream      stream   = null;

            try
            {
                response = request.GetResponse();
                stream   = response.GetResponseStream();
                T   result = (T)ResponseCodecFactory.Create().Unmarshal(stream);
                var etag   = response.Headers[HttpResponseHeader.ETag];

                Cache.Add(new SolrCacheEntity <T>(u.Uri.ToString(), etag, result));

                return(result);
            }
            catch (WebException e)
            {
                if (e.Response != null)
                {
                    var r = (HttpWebResponse)e.Response;

                    if (r.StatusCode == HttpStatusCode.NotModified)
                    {
                        return(cached.Data);
                    }
                }

                throw e;
            }
            finally
            {
                if (stream != null)
                {
                    stream.Close();
                }
                if (response != null)
                {
                    response.Close();
                }
            }
        }