Asp.net 如何在.Net中动态调用Web服务
我正在用C#编写一个Web服务客户机,它获取Web服务的URL和Web方法名 我想检查wweb方法是否真的接收到int并返回DataTable,如果这是真的,它应该调用它并返回DataTable 我发现有几篇文章是通过动态编译代理类来实现的Asp.net 如何在.Net中动态调用Web服务,asp.net,web-services,.net-3.5,Asp.net,Web Services,.net 3.5,我正在用C#编写一个Web服务客户机,它获取Web服务的URL和Web方法名 我想检查wweb方法是否真的接收到int并返回DataTable,如果这是真的,它应该调用它并返回DataTable 我发现有几篇文章是通过动态编译代理类来实现的 但对于我来说,这太昂贵了,因为客户端实际上是一个WSS Web部件,我不想每次呈现页面时都这样做;仅当属性更改时。如果Web服务始终相同(即方法及其返回的内容相同),并且uit只是可能更改的url,则只需向其中包含Web部件的项目添加Web引用,即可设置代理
但对于我来说,这太昂贵了,因为客户端实际上是一个WSS Web部件,我不想每次呈现页面时都这样做;仅当属性更改时。如果Web服务始终相同(即方法及其返回的内容相同),并且uit只是可能更改的url,则只需向其中包含Web部件的项目添加Web引用,即可设置代理的url,如下所示:
using (var serviceProxy = new ServiceProxy())
{
serviceProxy.Url = somepropertysetbythewebpart;
// make call to method here
}
如果Web服务总是相同的(即方法及其返回的内容相同),并且uit只是可能更改的url,那么只需向项目添加一个Web引用,其中包含Web部件,即可设置代理的url,如下所示:
using (var serviceProxy = new ServiceProxy())
{
serviceProxy.Url = somepropertysetbythewebpart;
// make call to method here
}
归根结底,web服务描述只是一个XML文件。您可以通过请求service.asmx?WSDL来获取它:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1753/Service1.asmx?WSDL");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string xml = reader.ReadToEnd();
一旦您有了服务描述,您就可以解析它并检查方法签名。然后,您可以使用HTTP POST调用该方法:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1753/Service1.asmx?HelloWorld");
request.Method = "POST";
request.ContentType = "application/soap+xml; charset=utf-8";
byte[] data = Encoding.UTF8.GetBytes(
@"<?xml version='1.0' encoding='utf-8'?>
<soap12:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap12='http://www.w3.org/2003/05/soap-envelope'>
<soap12:Body>
<HelloWorld xmlns='http://tempuri.org/' />
</soap12:Body>
</soap12:Envelope>");
request.ContentLength = data.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string xml = reader.ReadToEnd();
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(“http://localhost:1753/Service1.asmx?HelloWorld");
request.Method=“POST”;
request.ContentType=“application/soap+xml;charset=utf-8”;
字节[]数据=Encoding.UTF8.GetBytes(
@"
");
request.ContentLength=data.Length;
Stream requestStream=request.GetRequestStream();
requestStream.Write(数据,0,数据长度);
requestStream.Close();
HttpWebResponse=(HttpWebResponse)request.GetResponse();
StreamReader=新的StreamReader(response.GetResponseStream(),Encoding.UTF8);
字符串xml=reader.ReadToEnd();
归根结底,web服务描述只是一个XML文件。您可以通过请求service.asmx?WSDL来获取它:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1753/Service1.asmx?WSDL");
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string xml = reader.ReadToEnd();
一旦您有了服务描述,您就可以解析它并检查方法签名。然后,您可以使用HTTP POST调用该方法:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://localhost:1753/Service1.asmx?HelloWorld");
request.Method = "POST";
request.ContentType = "application/soap+xml; charset=utf-8";
byte[] data = Encoding.UTF8.GetBytes(
@"<?xml version='1.0' encoding='utf-8'?>
<soap12:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap12='http://www.w3.org/2003/05/soap-envelope'>
<soap12:Body>
<HelloWorld xmlns='http://tempuri.org/' />
</soap12:Body>
</soap12:Envelope>");
request.ContentLength = data.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string xml = reader.ReadToEnd();
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(“http://localhost:1753/Service1.asmx?HelloWorld");
request.Method=“POST”;
request.ContentType=“application/soap+xml;charset=utf-8”;
字节[]数据=Encoding.UTF8.GetBytes(
@"
");
request.ContentLength=data.Length;
Stream requestStream=request.GetRequestStream();
requestStream.Write(数据,0,数据长度);
requestStream.Close();
HttpWebResponse=(HttpWebResponse)request.GetResponse();
StreamReader=新的StreamReader(response.GetResponseStream(),Encoding.UTF8);
字符串xml=reader.ReadToEnd();
经过多次重新归档,我发现了如何进行归档。所选答案的代码几乎就在那里,但我必须在标题中添加SOAPAction
,并更改ContentType
以下是完整的代码:
var strRequest = @"<soap12:Envelope>
...
</soap12:Envelope>";
string webServiceUrl = "http://localhost:8080/AccontService.svc";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webServiceUrl);
request.Method = "POST";
request.ContentType = "text/xml;charset=UTF-8";
request.Accept = "text/xml";
request.Headers.Add("SOAPAction", "http://tempuri.org/IAccountService/UpdateAccount");
byte[] data = Encoding.UTF8.GetBytes(strRequest);
request.ContentLength = data.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string responseXmlString = reader.ReadToEnd();
return new HttpResponseMessage()
{
Content = new StringContent(responseXmlString, Encoding.UTF8, "application/xml")
};
var strequest=@”
...
";
字符串webServiceUrl=”http://localhost:8080/AccontService.svc";
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(webServiceUrl);
request.Method=“POST”;
request.ContentType=“text/xml;charset=UTF-8”;
request.Accept=“text/xml”;
添加(“SOAPAction”http://tempuri.org/IAccountService/UpdateAccount");
byte[]data=Encoding.UTF8.GetBytes(strRequest);
request.ContentLength=data.Length;
Stream requestStream=request.GetRequestStream();
requestStream.Write(数据,0,数据长度);
requestStream.Close();
HttpWebResponse=(HttpWebResponse)request.GetResponse();
StreamReader=新的StreamReader(response.GetResponseStream(),Encoding.UTF8);
string responseXmlString=reader.ReadToEnd();
返回新的HttpResponseMessage()
{
Content=newstringcontent(responseXmlString,Encoding.UTF8,“应用程序/xml”)
};
经过多次重新归档,我发现了如何进行归档。所选答案的代码几乎就在那里,但我必须在标题中添加SOAPAction
,并更改ContentType
以下是完整的代码:
var strRequest = @"<soap12:Envelope>
...
</soap12:Envelope>";
string webServiceUrl = "http://localhost:8080/AccontService.svc";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(webServiceUrl);
request.Method = "POST";
request.ContentType = "text/xml;charset=UTF-8";
request.Accept = "text/xml";
request.Headers.Add("SOAPAction", "http://tempuri.org/IAccountService/UpdateAccount");
byte[] data = Encoding.UTF8.GetBytes(strRequest);
request.ContentLength = data.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
string responseXmlString = reader.ReadToEnd();
return new HttpResponseMessage()
{
Content = new StringContent(responseXmlString, Encoding.UTF8, "application/xml")
};
var strequest=@”
...
";
字符串webServiceUrl=”http://localhost:8080/AccontService.svc";
HttpWebRequest请求=(HttpWebRequest)WebRequest.Create(webServiceUrl);
request.Method=“POST”;
request.ContentType=“text/xml;charset=UTF-8”;
request.Accept=“text/xml”;
添加(“SOAPAction”http://tempuri.org/IAccountService/UpdateAccount");
byte[]data=Encoding.UTF8.GetBytes(strRequest);
request.ContentLength=data.Length;
Stream requestStream=request.GetRequestStream();
requestStream.Write(数据,0,数据长度);
requestStream.Close();
HttpWebResponse=(HttpWebResponse)request.GetResponse();
StreamReader=新的StreamReader(response.GetResponseStream(),Encoding.UTF8);
string responseXmlString=reader.ReadToEnd();
返回新的HttpResponseMessage()
{
Content=newstringcontent(responseXmlString,Encoding.UTF8,“应用程序/xml”)
};
实际上,这两种情况都可以改变。。。我可能会在一个页面中指出,但在另一个页面中,这可能是,并且被调用的方法的名称也可以更改…实际上这两种情况都可以更改。。。我可能会在一个页面中指出,但在另一个页面中,这可能是,并且被调用的方法的名称也可以更改…Thks Pavel!我会进去试试看。。。我还发现了一些关于ServiceDescription对象的信息,我认为这些信息可以帮助我验证WSDL.Thks Pavel!我会进去试试看。。。我还发现了一些关于ServiceDescription对象的信息,我认为这些信息可以帮助我验证WSDL。