如果您想了解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文件怎么访问)
- .Net WebClient调用WebService
- .net – 不同的WSDL ASMX,WCF Web服务
- .net – 如何确保只能一次调用一次asmx Web服务?
- asmx – 何时使用页面方法而不是创建Web服务?
asp.net – 如何使用WebClient访问ASMX Web服务?(asp文件怎么访问)
首先,是的,我知道我可以在类库中创建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
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 |
|
|
调用服务处理:
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服务
我尝试来到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.
谢谢.
解决方法
.net – 如何确保只能一次调用一次asmx Web服务?
换句话说,如果服务被客户端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服务?
解决方法
简单的例子,
如果您已经让我们说需要身份验证,那么您有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服务?的相关信息,可以在本站进行搜索。
本文标签: