2013-04-05 160 views
0

我是REST webservices的新手。我需要在C#控制台应用程序中使用现有的REST服务。我正在获取以下行中的XML响应。如何从客户端读取StreamReader响应?

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 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 = " [email protected]", 
       ContentType = "application/xml" 
      } 
     }; 
     services.SearchContactDetailsAsync(req); 
     autoRestEvent.WaitOne(); 

    } 

参考

  1. XML deserialization generic method

回答

1

以下是用于读取来自REST服务的响应的伪代码。这具有一个通用的反序列化方法

注:ContactDetailsPreview是响应对象类型

//通用反序列化

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

//代码段1

restClient.DoPost(builder.Uri, Serializer.SerializeXml(addressBookDataRequest.contactsSearchCriteria), SearchContactSuccess, SearchContactFailed, addressBookDataRequest.HeaderParams); 

//代码段2

public event EventHandler<ServiceResponseEventArgs<ContactDetailsPreview[]>> SearchContactDetailsCompleted; 

//代码段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(); 
    } 

//通用处理的搜索成功响应

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)); 

} 
+0

参考:http://stackoverflow.com/questions/14562415/xml-deserialization-generic-method – Lijo 2013-04-26 11:47:03

1

.NET的XmlDocument Class具有接受流

当我看到它,你只需要提供流给它

XmlDocument doc = XmlDocument.Load(readStream); 

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

+0

通过'使用的System.Xml;'或(如果没有参考)添加一个新的参考系统.Xml库 – Torben 2013-04-05 11:23:35

1

要创建XmlDocument fr OM流: -

XmlDocument document = new XmlDocument(); 
using(StreamReader readStream = new StreamReader(receiveStream, encode)) 
{   
    document.Load(readStream); 
} 

重写MyMethod采取的XmlDocument

public void MyMethod(XmlDocument xDoc) 

而在它传递的SearchContactSuccess方法里面,假设你有一个类的实例,并到哪里参考consoleapp/utility驻留等:

MyMethod(document); 
相关问题