Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/34.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
Asp.net 如何在.Net中动态调用Web服务_Asp.net_Web Services_.net 3.5 - Fatal编程技术网

Asp.net 如何在.Net中动态调用Web服务

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引用,即可设置代理

我正在用C#编写一个Web服务客户机,它获取Web服务的URL和Web方法名

我想检查wweb方法是否真的接收到int并返回DataTable,如果这是真的,它应该调用它并返回DataTable

我发现有几篇文章是通过动态编译代理类来实现的


但对于我来说,这太昂贵了,因为客户端实际上是一个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。