Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从客户端读取StreamReader响应?_C#_Xml_Wcf_Rest_Generics - Fatal编程技术网

C# 如何从客户端读取StreamReader响应?

C# 如何从客户端读取StreamReader响应?,c#,xml,wcf,rest,generics,C#,Xml,Wcf,Rest,Generics,我不熟悉REST Web服务。我需要在C#控制台应用程序中使用现有的REST服务。我将在下面一行中得到XML响应 readStream.ReadLine(); 我们如何在客户机中使用REST响应 实用程序 public void SearchContactDetailsAsync(Models.AddressBookRequest addressBookDataRequest) { UriBuilder builder = new UriBuilder(url);

我不熟悉REST Web服务。我需要在C#控制台应用程序中使用现有的REST服务。我将在下面一行中得到XML响应

readStream.ReadLine();
我们如何在客户机中使用REST响应

实用程序

  public void SearchContactDetailsAsync(Models.AddressBookRequest addressBookDataRequest)
    {
        UriBuilder builder = new UriBuilder(url);
        restClient.DoPost(builder.Uri, Serializer.SerializeXml(addressBookDataRequest.contactsSearchCriteria), SearchContactSuccess, SearchContactFailed, addressBookDataRequest.HeaderParams);
    }

    private void SearchContactSuccess(HttpWebResponse response)
    {
        //Call base service method - to inspect the response and publish an event
        HandleServiceSearchSuccess<ContactDetailsPreview[]>(SearchContactDetailsCompleted, "contactDetailsPreviews", response);
        Stream receiveStream = response.GetResponseStream();
        Encoding encode = System.Text.Encoding.UTF8;

        StreamReader readStream = new StreamReader(receiveStream, encode);
        readStream.ReadLine();

    }
public void search联系人详细信息同步(Models.AddressBookRequest addressBookDataRequest)
{
UriBuilder=新的UriBuilder(url);
restClient.DoPost(builder.Uri、Serializer.SerializeXml(addressBookDataRequest.contactsSearchCriteria)、SearchContactSuccess、SearchContactFailed、addressBookDataRequest.HeaderParams);
}
私有void SearchContactSuccess(HttpWebResponse)
{
//调用基本服务方法-检查响应并发布事件
HandleServiceSearchSuccess(搜索联系人详细信息已完成,“联系人详细信息预览”,响应);
Stream receiveStream=response.GetResponseStream();
Encoding encode=System.Text.Encoding.UTF8;
StreamReader readStream=新的StreamReader(接收流,编码);
readStream.ReadLine();
}
控制台应用程序

    public void MyMethod()
    {
        autoRestEvent = new AutoResetEvent(false);
        services = new communicationSvcs();
        services.SearchContactDetailsCompleted += new EventHandler<RestClientUtility.EventArg.ServiceResponseEventArgs<RestClientUtility.Models.ContactDetailsPreview[]>>(services_SearchContactDetailsCompleted);

        //Call the operation
        AddressBookRequest req = new AddressBookRequest
        {
            contactsSearchCriteria = new ContactsSearchCriteria
            {
                searchUserID = "ss23ed"

            },
            HeaderParams = new RestClientUtility.Requests.HttpHeaderParms
            {
                UserId = "ss23ed",
                UserPrincipalName = " ss23ed@hotmail.com",
                ContentType = "application/xml"
            }
        };
        services.SearchContactDetailsAsync(req);
        autoRestEvent.WaitOne();

    }
public void MyMethod()
{
AutoResteEvent=新的AutoResteEvent(假);
服务=新通信vcs();
services.SearchContactDetailsCompleted+=新事件处理程序(services\u SearchContactDetailsCompleted);
//呼叫手术室
AddressBookRequest req=新的AddressBookRequest
{
contactsSearchCriteria=新contactsSearchCriteria
{
searchUserID=“ss23ed”
},
HeaderParams=new RestClientUtility.Requests.HttpHeaderParams
{
UserId=“ss23ed”,
UserPrincipalName=”ss23ed@hotmail.com",
ContentType=“应用程序/xml”
}
};
服务。SearchContactDetailsAsync(请求);
autorestrevent.WaitOne();
}
参考资料

  • .NET有一个接受流的Load()方法

    在我看来,您只需要向它提供流

     XmlDocument doc = XmlDocument.Load( readStream );
    
    我真的看不出它是否是一个静态方法,我这里没有测试它的环境,但是可能需要先创建一个XmlDocument实例,然后从中运行Load()方法(如果它不是静态的)

    .NET有一个接受流的Load()方法

    在我看来,您只需要向它提供流

     XmlDocument doc = XmlDocument.Load( readStream );
    

    我真的看不出它是否是一个静态方法,我这里没有测试它的环境,但可能需要先创建一个XmlDocument实例,然后从中运行Load()方法(如果它不是静态的)

    从流中创建
    XmlDocument
    :-

    XmlDocument document = new XmlDocument();
    using(StreamReader readStream = new StreamReader(receiveStream, encode)) 
    {        
        document.Load(readStream);
    }
    
    重写
    MyMethod
    以获取
    XmlDocument

    public void MyMethod(XmlDocument xDoc)
    
    并在
    SearchContactSuccess
    方法中传递它,假设您有该类的实例和对consoleapp/实用程序所在位置的引用,等等:

    MyMethod(document);
    

    要从流创建
    XmlDocument
    :-

    XmlDocument document = new XmlDocument();
    using(StreamReader readStream = new StreamReader(receiveStream, encode)) 
    {        
        document.Load(readStream);
    }
    
    重写
    MyMethod
    以获取
    XmlDocument

    public void MyMethod(XmlDocument xDoc)
    
    并在
    SearchContactSuccess
    方法中传递它,假设您有该类的实例和对consoleapp/实用程序所在位置的引用,等等:

    MyMethod(document);
    

    下面是从REST服务读取响应的伪代码。这有一种通用的反序列化方法

    注意:ContactDetailsPreview是响应对象类型

    //泛型反序列化

      public static T DeserializeXml<T>(Stream stream, XmlRootAttribute root)
      {
                XmlSerializer deserializer = new XmlSerializer(typeof(T), root);
                return (T)deserializer.Deserialize(stream);
      }
    
    //代码段2

    public event EventHandler<ServiceResponseEventArgs<ContactDetailsPreview[]>> SearchContactDetailsCompleted;
    
    公共事件处理程序SearchContactDetails已完成;
    
    //代码段3

    private void SearchContactSuccess(HttpWebResponse response)
        {
    
            //Call base service method - to inspect the response and publish an event
            HandleServiceSearchSuccess<ContactDetailsPreview[]>(SearchContactDetailsCompleted, "contactDetailsPreviews", response);
            Stream receiveStream = response.GetResponseStream();
            Encoding encode = System.Text.Encoding.UTF8;
            StreamReader readStream = new StreamReader(receiveStream, encode);
            readStream.ReadLine();
        }
    
    private void SearchContactSuccess(HttpWebResponse)
    {
    //调用基本服务方法-检查响应并发布事件
    HandleServiceSearchSuccess(搜索联系人详细信息已完成,“联系人详细信息预览”,响应);
    Stream receiveStream=response.GetResponseStream();
    Encoding encode=System.Text.Encoding.UTF8;
    StreamReader readStream=新的StreamReader(接收流,编码);
    readStream.ReadLine();
    }
    
    //搜索成功响应的通用处理程序

    public void HandleServiceSearchSuccess<T>(EventHandler<ServiceResponseEventArgs<T>> eventHandler, String rootElementName, HttpWebResponse response)
    {
    EventHandler<ServiceResponseEventArgs<T>> theGivenEventHandler = eventHandler;
    obj = Serializer.DeserializeXml<T>(response.GetResponseStream(), new XmlRootAttribute() { ElementName = rootElementName });
        theGivenEventHandler(this, new ServiceResponseEventArgs<T>(obj));
    
    }
    
    public void HandleServiceSearchSuccess(EventHandler EventHandler,String rootElementName,HttpWebResponse响应)
    {
    EventHandler theGiveNevenHandler=EventHandler;
    obj=Serializer.DeserializeXml(response.GetResponseStream(),new XmlRootAttribute(){ElementName=rootElementName});
    他们给了Nevenhandler(这是新的服务响应Eventargs(obj));
    }
    
    以下是从REST服务读取响应的伪代码。这有一种通用的反序列化方法

    注意:ContactDetailsPreview是响应对象类型

    //泛型反序列化

      public static T DeserializeXml<T>(Stream stream, XmlRootAttribute root)
      {
                XmlSerializer deserializer = new XmlSerializer(typeof(T), root);
                return (T)deserializer.Deserialize(stream);
      }
    
    //代码段2

    public event EventHandler<ServiceResponseEventArgs<ContactDetailsPreview[]>> SearchContactDetailsCompleted;
    
    公共事件处理程序SearchContactDetails已完成;
    
    //代码段3

    private void SearchContactSuccess(HttpWebResponse response)
        {
    
            //Call base service method - to inspect the response and publish an event
            HandleServiceSearchSuccess<ContactDetailsPreview[]>(SearchContactDetailsCompleted, "contactDetailsPreviews", response);
            Stream receiveStream = response.GetResponseStream();
            Encoding encode = System.Text.Encoding.UTF8;
            StreamReader readStream = new StreamReader(receiveStream, encode);
            readStream.ReadLine();
        }
    
    private void SearchContactSuccess(HttpWebResponse)
    {
    //调用基本服务方法-检查响应并发布事件
    HandleServiceSearchSuccess(搜索联系人详细信息已完成,“联系人详细信息预览”,响应);
    Stream receiveStream=response.GetResponseStream();
    Encoding encode=System.Text.Encoding.UTF8;
    StreamReader readStream=新的StreamReader(接收流,编码);
    readStream.ReadLine();
    }
    
    //搜索成功响应的通用处理程序

    public void HandleServiceSearchSuccess<T>(EventHandler<ServiceResponseEventArgs<T>> eventHandler, String rootElementName, HttpWebResponse response)
    {
    EventHandler<ServiceResponseEventArgs<T>> theGivenEventHandler = eventHandler;
    obj = Serializer.DeserializeXml<T>(response.GetResponseStream(), new XmlRootAttribute() { ElementName = rootElementName });
        theGivenEventHandler(this, new ServiceResponseEventArgs<T>(obj));
    
    }
    
    public void HandleServiceSearchSuccess(EventHandler EventHandler,String rootElementName,HttpWebResponse响应)
    {
    EventHandler theGiveNevenHandler=EventHandler;
    obj=Serializer.DeserializeXml(response.GetResponseStream(),new XmlRootAttribute(){ElementName=rootElementName});
    他们给了Nevenhandler(这是新的服务响应Eventargs(obj));
    }
    
    通过
    使用System.Xml或(如果没有引用)向System.Xml libraryT添加新引用