【问题标题】:Make http WebRequest work in C#使 http WebRequest 在 C# 中工作
【发布时间】:2016-12-28 15:33:42
【问题描述】:

我想从一个 http 网站得到响应,我已经使用了这个代码

// Create a new request to the mentioned URL.    
WebRequest myWebRequest = WebRequest.Create("http://127.0.0.1:8080/geoserver/NosazMohaseb/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=NosazMohaseb:GParcelLAyer&maxFeatures=50&outputFormat=application%2Fjson&bbox=5727579.437775434,3838435.3419322656,5727581.1322169611,3838437.0363737918");

//   var myWebRequest = WebRequest.Create(myUri);
myWebRequest.Method ="GET";
myWebRequest.Timeout = TimeOut;

if (myWebRequest is HttpWebRequest)
{
   ( myWebRequest as HttpWebRequest).Accept = "application/json";
    (myWebRequest as HttpWebRequest).ContentType = "application/json";
    //(myWebRequest as HttpWebRequest).Accept = 
    (myWebRequest as HttpWebRequest).KeepAlive = false;
    (myWebRequest as HttpWebRequest).UserAgent = "SharpMap-WMSLayer";
}

if (Credentials != null)
{
    myWebRequest.Credentials = Credentials;
    myWebRequest.PreAuthenticate = true;
}
else
    myWebRequest.Credentials = CredentialCache.DefaultCredentials;

if (Proxy != null)
    myWebRequest.Proxy = Proxy;

try
{
    using (var myWebResponse = (HttpWebResponse)myWebRequest.GetResponse())
    {           
        using (var dataStream = myWebResponse.GetResponseStream())
        {
            var cLength = (int)myWebResponse.ContentLength;
        }
        myWebResponse.Close();
    }
}
catch (WebException webEx)
{
    if (!this.ContinueOnError)
        throw (new RenderException(
            "There was a problem connecting to the WMS server when rendering layer '" + LayerName + "'",
            webEx));
}
catch (Exception ex)
{
    if (!ContinueOnError)
        throw (new RenderException("There was a problem rendering layer '" + LayerName + "'", ex));
}

但是当我尝试获取cLength时它是-1,所以它不起作用,但是当我尝试访问这个网站时

http://127.0.0.1:8080/geoserver/NosazMohaseb/ows?service=WFS&version=1.0.0&request=GetFeature&typeName=NosazMohaseb:GParcelLAyer&maxFeatures=50&outputFormat=application%2Fjson&bbox=5727579.437775434,3838435.3419322656,5727581.1322169611,3838437.0363737918

我得到以下答案

{"type":"FeatureCollection","totalFeatures":2,"features":[{"type":"Feature","id":"GParcelLAyer.14970","geometry":{"type":"Polygon","coordinates":[[[5727597.96542913,3838442.73401128],[5727595.60003176,3838429.21114233],[5727576.62444883,3838431.10604568],[5727571.16785106,3838432.76483769],[5727569.78420277,3838437.30665986],[5727570.19434939,3838439.63808217],[5727597.96542913,3838442.73401128]]]},"geometry_name":"geom","properties":{"FK_BlockNo":"12055","FK_LandNo":"8","NoApart":"100000","Name":"                    ","Family":"??","Father":"                    ","MeliNo":"          ","MalekType":"1   ","PostCode":"0         ","Id_Parvande":null,"BuildNo":null,"BuildTypeCode":null,"BuildUserTypeCode":null,"BuildViewTypeCode":null,"BuildGhedmatCode":null,"Farsoode":"0"}}],"crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:EPSG::900913"}}}

所以在使用 C# 进行响应时,我似乎遗漏了一些东西。你能帮我找出我的错误吗? 谢谢

【问题讨论】:

标签: c# .net webrequest


【解决方案1】:

在您的代码中,您实际上只是获得了响应流,然后您没有从该流中读取任何内容 - 这就是您没有获得任何数据的原因。

您必须创建流阅读器并使用它从响应流中读取数据(如果您的数据量很大,请考虑使用缓冲的Read 而不是ReadToEnd):

using (var dataStream = myWebResponse.GetResponseStream())
using (var reader = new StreamReader(dataStream))
{
    string data = reader.ReadToEnd();
}

关于 ContentLength 在你的情况下等于 -1 - 好吧,它可能是你的服务器端的东西,检查你的服务器是否真的返回这个头。事实上,这个头不是强制性的,你不应该依赖它。

【讨论】:

    猜你喜欢
    • 2016-07-18
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多