C# 如何从客户端读取StreamReader响应?
我不熟悉REST Web服务。我需要在C#控制台应用程序中使用现有的REST服务。我将在下面一行中得到XML响应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);
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添加新引用