GVKun编程网logo

asp.net – 如何使用WebClient访问ASMX Web服务?(asp文件怎么访问)

4

如果您想了解asp.net–如何使用WebClient访问ASMXWeb服务?的相关知识,那么本文是一篇不可错过的文章,我们将对asp文件怎么访问进行全面详尽的解释,并且为您提供关于.NetWebCl

如果您想了解asp.net – 如何使用WebClient访问ASMX Web服务?的相关知识,那么本文是一篇不可错过的文章,我们将对asp文件怎么访问进行全面详尽的解释,并且为您提供关于.Net WebClient调用WebService、.net – 不同的WSDL ASMX,WCF Web服务、.net – 如何确保只能一次调用一次asmx Web服务?、asmx – 何时使用页面方法而不是创建Web服务?的有价值的信息。

本文目录一览:

asp.net – 如何使用WebClient访问ASMX Web服务?(asp文件怎么访问)

asp.net – 如何使用WebClient访问ASMX Web服务?(asp文件怎么访问)

我试图在一个类中创建一个方法,使用WebClient访问Web服务上的WebMethod,并遇到问题.在 Windows上使用VS2010.

首先,是的,我知道我可以在类库中创建Web服务的Web引用,当然这是设计时绑定.但是,我需要能够使用仅在运行时提供的信息来访问Web服务.有一个商业原因,我不会进入这里,请随便一起去.

这似乎可以使用System.Net命名空间中的WebClient类.事实上,我能够得到有问题的服务,但我发送给它的数据似乎没有正确的格式,尽管我可以说它是一个格式正确的SOAP消息.

WebException包含以下消息:“远程服务器返回错误:(415)不支持的媒体类型.”

这是代码:

public string DoingBusiness()
{
    WebClient client = new WebClient();
    string destUri = "http://localhost/Service/Service.asmx?op=CommunicationsCheck";

    StreamReader reader = new StreamReader(@"CommCheck.xml");
    string data = String.Format(reader.ReadToEnd(),"The End is Near!");
    reader.Close();

    string response = client.UploadString(destUri,data);

    return response;
}

离开敏感的实际xmlns,上面的StreamReader读取的数据如下所示:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Body>
    <CommunicationsCheck xmlns="http://.../">
      <communication>{0}</communication>
    </CommunicationsCheck>
  </soap:Body>
</soap:Envelope>

这看起来像一个完美的SOAP消息.当然,“{0}”会填充有效负载字符串.如果WebMethod“CommunicationsCheck(字符串通信)成功运行,它将返回:

<?xml version="1.0" encoding="utf-8" ?> 
<string xmlns="http://[service url]/">You sent 'The End is Near!'</string>

如果我通过浏览器或通过设计时Web引用访问服务,它会做什么.

所以,问题是,我在这里做错了,我得到了“(415)不支持的媒体类型”

是否需要设置WebClient上的属性?我是否需要提供包含UserAgent的Header?或者是其他东西?

解决方法

该死.我想我应该让别人回答这个问题,但回答一个人自己的问题是可以接受的,如果你发现自己的话.

无论如何,对这个问题的一些进一步研究似乎表明,我可能会猜测,即我需要设置一些Header属性,这是一个可能的解决方案.研究表明,属性将是“内容类型”,需要设置为“text / xml”.所以我添加了这一行:

client.Headers.Add("content-type","text/xml");

就在UploadString方法调用之前.

答对了!

发生了预期的反应.

有没有人注意到,一旦提出问题,有些问题的答案有时会变得不言而喻,而不是之前?有趣的现象.

.Net WebClient调用WebService

.Net WebClient调用WebService

WebClient调用WebService

(文末下载完整代码)

先上代码:

object[] inObjects = new[] { "14630, 14631" };  HttpWebClient wc = new HttpWebClient(2300);  var result1 = WebServiceClientHelper.InvokeWebService("ESBService_TEST", "", "QueryVocabSet", inObjects, wc);  WriteLine(result1.ToString());

public class HttpWebClient : WebClient {  /// <summary>  /// 初始化需要设置超时时间,以毫秒为单位  /// </summary>  /// <param name="timeout">毫秒为单位</param>  public HttpWebClient(int timeout)  {   Timeout = timeout;  }  public int Timeout { get; set; }  /// <summary>  /// 重写 GetWebRequest,添加 WebRequest 对象超时时间  /// </summary>  protected override WebRequest GetWebRequest(Uri address)  {   HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);   request.Timeout = Timeout;   request.ReadWriteTimeout = Timeout;   return request;  } }

  HttpWebRequest 改造依据:

WebClient

HttpWebRequest

提供用于将数据发送到由 URI 标识的资源及从这样的资源接收数据的常用方法。

public class HttpWebRequest : WebRequest, ISerializable

Assembly location:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.dll

Assembly location:

C:\Windows\Microsoft.NET\Framework\v4.0.30319\System.dll

protected virtual WebRequest GetWebRequest(Uri address) {  WebRequest request = WebRequest.Create(address);  this.CopyHeadersTo(request);  if (this.Credentials != null)  request.Credentials = this.Credentials;  if (this.m_Method != null)  request.Method = this.m_Method;  if (this.m_ContentLength != -1L)  request.ContentLength = this.m_ContentLength;  if (this.m_ProxySet)  request.Proxy = this.m_Proxy;  if (this.m_CachePolicy != null)  request.CachePolicy = this.m_CachePolicy;  return request; } protected virtual WebResponse GetWebResponse(WebRequest request) {  WebResponse response = request.GetResponse();  this.m_WebResponse = response;  return response; }

 

 

public class HttpWebClient : WebClient {  /// <summary>  /// 初始化需要设置超时时间,以毫秒为单位  /// </summary>  /// <param name="timeout">毫秒为单位</param>  public HttpWebClient(int timeout)  {   Timeout = timeout;  }  public int Timeout { get; set; }  /// <summary>  /// 重写 GetWebRequest,添加 WebRequest 对象超时时间  /// </summary>  protected override WebRequest GetWebRequest(Uri address)  {   HttpWebRequest request = (HttpWebRequest)base.GetWebRequest(address);   request.Timeout = Timeout;   request.ReadWriteTimeout = Timeout;   return request;  } }

 

  调用服务处理:

public static object InvokeWebService(string providerName, string url, string methodName, object[] args, WebClient wc = null)  {   object result = null;   if (wc == null) wc = new WebClient();   using (wc)   {    using (Stream wsdl = wc.OpenRead(url))    {     var client = GetClient(wsdl, url, methodName, providerName);     client.SetValue("Timeout", wsdl.ReadTimeout);     result = client.InvokeService(args);    }   }   return result;  }

  形如这样 的地址,

  返回的是 dududuTest 服务下公开的方法,以流的形式,

  代码处理里面需要解读这种流,目前看到的一种方式是,把这个流解读编译成一个动态的dll,利用反射,动态调用方法。

/// <summary>为从具有 <see cref="T:System.String" /> 指定的 URI 的资源下载的数据打开一个可读的流。</summary> /// <returns>一个 <see cref="T:System.IO.Stream" />,用于从资源读取数据。</returns> /// <param name="address">以 <see cref="T:System.String" /> 形式指定的 URI,将从中下载数据。</param> public Stream OpenRead(string address) {  if (address == null)  throw new ArgumentNullException(nameof (address));  return this.OpenRead(this.GetUri(address)); } /// <summary>为从具有 <see cref="T:System.Uri" /> 指定的 URI 的资源下载的数据打开一个可读的流</summary> /// <returns>一个 <see cref="T:System.IO.Stream" />,用于从资源读取数据。</returns> /// <param name="address">以 <see cref="T:System.Uri" /> 形式指定的 URI,将从中下载数据。</param> public Stream OpenRead(Uri address) {  if (Logging.On)  Logging.Enter(Logging.Web, (object) this, nameof (OpenRead), (object) address);  if (address == (Uri) null)  throw new ArgumentNullException(nameof (address));  WebRequest request = (WebRequest) null;  this.ClearWebClientState();  try  {  request = this.m_WebRequest = this.GetWebRequest(this.GetUri(address));  Stream responseStream = (this.m_WebResponse = this.GetWebResponse(request)).GetResponseStream();  if (Logging.On)   Logging.Exit(Logging.Web, (object) this, nameof (OpenRead), (object) responseStream);  return responseStream;  }  catch (Exception ex)  {  Exception innerException = ex;  if (innerException is ThreadAbortException || innerException is StackOverflowException || innerException is OutOfMemoryException)  {   throw;  }  else  {   if (!(innerException is WebException) && !(innerException is SecurityException))   innerException = (Exception) new WebException(SR.GetString("net_webclient"), innerException);   WebClient.AbortRequest(request);   throw innerException;  }  }  finally  {  this.CompleteWebClientState();  } }

View Code

  类 DefaultWebServiceClient 定义:

public class DefaultWebServiceClient {  Type _type;  MethodInfo _method;  object _obj;  public object InvokeService(object[] args)  {   object proxy = GetProxy();   return _method.Invoke(proxy, args);  }  public void SetValue(string fieldName, object value)  {   object proxy = GetProxy();   PropertyInfo field = _type.GetProperty(fieldName);   if (field != null)    field.SetValue(proxy, value);  }  pu.........

.net – 不同的WSDL ASMX,WCF Web服务

.net – 不同的WSDL ASMX,WCF Web服务

我有asmx web-service,它可以从其他客户端(.NET,Delphi)成功使用.

我尝试来到wcf,并在WCF服务中编写相同的逻辑(basicHttpBinding用于互操作性). (.net客户端消耗正常,但delphi 7无法调用此服务).

我开始研究两种服务(asmx,wcf)之间的差异并检测它们的wsdl是不同的:

WSDL asmx:

<s:element name="Test">

<s:complexType>

<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="a" type="s:int"/>
</s:sequence>
</s:complexType>
</s:element>

<s:element name="TestResponse">

<s:complexType>

<s:sequence>
<s:element minOccurs="0" maxOccurs="1" name="TestResult" type="s:string"/>
</s:sequence>
</s:complexType>
</s:element>

wcf的wsdl是相当不同的:

<wsdl:operation name="Test"> <soap:operation soapAction="http://tempuri.org/isyncer/Test"/>

<wsdl:input> <soap:body use="literal"/> </wsdl:input>

<wsdl:output> <soap:body use="literal"/> </wsdl:output>

<wsdl:fault name="ServiceFaultExceptionFault"> <soap:fault name="ServiceFaultExceptionFault" use="literal"/> </wsdl:fault> </wsdl:operation>

我认为delphi无法生成正确的代理是一个共鸣.

我可以配置wcf来生成与asmx相同的wsdl.

谢谢.

解决方法

您必须展平WSDL.请查看 http://geekswithblogs.net/EltonStoneman/archive/2008/07/30/flattening-wsdl-from-wcf-services.aspx和 http://wcfextras.codeplex.com/以获取信息.

.net – 如何确保只能一次调用一次asmx Web服务?

.net – 如何确保只能一次调用一次asmx Web服务?

我有一个asmx Web服务,只允许一次响应1个客户端.

换句话说,如果服务被客户端A调用,而服务器B调用,我希望B挂起,直到A完成,然后B才能得到服务.

如果这太复杂,那么在A接入服务的过程中,来自B的最低限度的呼叫将失败并且用户定义的错误.

原因是该服务在很大程度上依赖于IO操作和XML序列化,因此至关重要的是该服务不会被多个客户端同时调用.

提前致谢

解决方法

static object _LockObject = new object();

void WebServiceCall()
{
    lock(_LockObject)
    {
        // Do work...
    }
}

创建一个调用lock()的静态对象. lock()语句将阻止其他调用执行代码,直到第一次执行锁定完成.

请注意,根据您的超时设置,B可能会因超时而失败,具体取决于A完成的时间.

更新:是的,您可以使用Monitor类代替lock().您可以使用Monitor.TryEnter()方法检查对象是否已被锁定(即:如果您想返回错误而不是等待).

更多细节:

从http://msdn.microsoft.com/en-us/library/aa664735(VS.71).aspx开始:

表单的锁定声明

lock (x) ...

其中x是引用类型的表达式,恰好相当于

System.Threading.Monitor.Enter(x);
try {
   ...
}
finally {
   System.Threading.Monitor.Exit(x);
}

从http://msdn.microsoft.com/en-us/library/de0542zz.aspx开始:

使用Enter获取作为参数传递的对象的监视器.如果另一个线程在对象上执行了Enter,但尚未执行相应的Exit,则当前线程将阻塞,直到另一个线程释放该对象.

所以只是按设计,代码知道阻止而不是跳过.如果需要,可以使用Monitor.TryEnter()方法跳过.

asmx – 何时使用页面方法而不是创建Web服务?

asmx – 何时使用页面方法而不是创建Web服务?

我们的团队正试图找出使用页面方法与创建实际asmx Web服务的一些指导原则.在我看来,页面方法主要用于特定于页面的一种类型的调用,其中asmx旨在表示更多可重用的操作和服务.这听起来不错吗?

解决方法

是.如果您打算让多个应用程序使用某些东西,那么将它创建为单独的服务是明智的,因此您不会在应用程序之间重复代码,也不必在单个位置更改您的更改.

简单的例子,
如果您已经让我们说需要身份验证,那么您有2个应用程序,一个Web和一个窗口.
如果用户群将是相同的,那么进入Web App创建一个身份验证代码/页面,转到您的Windows应用程序并重新执行相同操作是没有意义的.原因是,如果必须更改哈希代码例如,你将不得不去网站更改它,然后转到Windows更改它,并且还重新部署窗口,现在
如果你有一个服务,你去服务改变它,现在一切都适用于新模型,一个很大的优点,你不必重新部署Windows应用程序.

多数民众赞成……

我们今天的关于asp.net – 如何使用WebClient访问ASMX Web服务?asp文件怎么访问的分享就到这里,谢谢您的阅读,如果想了解更多关于.Net WebClient调用WebService、.net – 不同的WSDL ASMX,WCF Web服务、.net – 如何确保只能一次调用一次asmx Web服务?、asmx – 何时使用页面方法而不是创建Web服务?的相关信息,可以在本站进行搜索。

本文标签: