使 http WebRequest 在 C# 中工作

Make http WebRequest work in C#

我想从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# 获取响应时遗漏了一些东西..你能帮我找出我的错误吗? 谢谢

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

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

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

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