C# 反序列化http响应
我正在使用(不是我的)一个用soap结构构建的apiC# 反序列化http响应,c#,asp.net,asp.net-web-api,C#,Asp.net,Asp.net Web Api,我正在使用(不是我的)一个用soap结构构建的api <?xml version='1.0' encoding='UTF-8'?> <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> <S:Body> <somePrefix:someNodeName xmlns="ulrWithNoPrefix" xmlns:somePrefix="urlWithPrefix
<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<somePrefix:someNodeName xmlns="ulrWithNoPrefix" xmlns:somePrefix="urlWithPrefix"
xmlns:anotherPrefix="UrlForAnotherprefix xmlns:AttributePrefix="UrlForAttributePrefix>
<anotherPrefix:childNode1>value</anotherPrefix:childNode1>
<anotherPrefix:childNode2>value</anotherPrefix:childNode2>
<anotherPrefix:childNode3>value</anotherPrefix:childNode3>
<anotherPrefix:childNode3 AttributePrefix:AttributeName="attributeValue/>
</somePrefix:someNodeName>
</S:Body>
</S:Envelope>
我想反序列化res字符串(上面显示了一个典型的结构)
还想知道我使用HttpClient的方式是否正确,或者更好的设计更好
谢谢
Gilad你能不能不只是添加对服务的引用(你需要服务的WSDL文档),.NET会为你生成代理类。我有WSDL和xsd,但所有位置和目标名称空间都是错误的。他们给了我一些静态文件,因为“live”该服务的文件格式不好。当我尝试向该服务添加引用或使用wsdl.exe自己创建代理文件时,由于xsd文件格式不正确,我失败了。我无法告诉他们-修复它,我需要找到一个解决方案……我创建了一个静态wsdl和xsd,并使用SoapUI管理创建所有soap请求/响应。我调整了wsdl文件以使用服务的ip地址而不是dns名称,这是能够引用wsdl文件并创建代码所需的全部。我不确定它是否会在这方面有所帮助,但我所做的是:1。如果包含任何xsd,请更改类型-->xsd:schema-->**xsd:include**schemaLocation属性到静态文件位置。2.将服务元素中wsdlsoap:address元素中的location元素更改为使用ip地址而不是dns名称。3.对于其他xsd文件中导入的每个xsd文件,我已将xsd:schema元素中xsd:import元素的schemaLocation属性更改为静态文件位置。在我做了这3个更改之后,我能够使用wsdl.exe工具或成功地为WCF添加引用。感谢CodeCaster和Chris Diver给我的两条明显的提示,让我回到正轨。有时候,你需要一个简单的“为什么不……”来让你重新思考……很高兴你把问题解决了。 public void RunPostTask(string url, string req) { string res = ""; var client = new HttpClient(); HttpRequestMessage request = new HttpRequestMessage(); request.Content = new StringContent(req); request.Content.Headers.ContentType = new MediaTypeHeaderValue("text/xml");
var task =
client.PostAsync(url, request.Content).ContinueWith((TaskResponse) =>
{
TaskResponse.Result.EnsureSuccessStatusCode();
var response = TaskResponse.Result;
var ReadTask = response.Content.ReadAsStringAsync();
ReadTask.Wait(10000);
res = ReadTask.Result;
}).ContinueWith((err) =>
{
if (err.Exception != null)
{
res = err.Exception.ToString();
}
});
task.Wait(10000);
}