我在桌面应用程序中使用了Soap服务 http://example.com/soap/webservice.php 。我创建了一个单独的类库包含该服务并使用此类库在我的主应用程序中使用它,我工作正常。
以下是我正在使用的代码:
MyService.PushServerWSPortTypeClient obj = new MyService.PushServerWSPortTypeClient();
string result = obj.auth(apiId, UserName, Password);
这很完美。
但是当我在我的Windows服务中使用此服务时,我得到了例外:
http://exmaple.com/soap/webservice.php没有可以接受该消息的端点。这通常是由错误的地址或SOAP操作引起的。有关更多详细信息,请参阅InnerException(如果存在)。
我知道这个异常意味着它无法在我的服务中找到它的端点,但是在我的类库中,端点是在 app.config 中提到的,我还在我的中添加了这些端点Windows服务app.config也是如此。
以下是 app.config 的代码:
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="PushServerWSBinding" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://example.com/soap/webservice.php"
binding="basicHttpBinding" bindingConfiguration="PushServerWSBinding"
contract="MyService.PushServerWSPortType" name="PushServerWSPort" />
</client>
</system.serviceModel>
无法解析远程名称:'api.example.com'
at System.Net.HttpWebRequest.GetRequestStream(TransportContext&amp; context) 在System.Net.HttpWebRequest.GetRequestStream() 在System.ServiceModel.Channels.HttpOutput.WebRequestHttpOutput.GetOutputStream()
答案 0 :(得分:1)
您的浏览器可能会使用代码所在的代理(或使用不同的代理)。
如果是这种情况,请确保将WebClient.Proxy属性设置为与浏览器中的属性匹配,并使用
来使用WebProxy类WebClient webClient = new WebClient())
{
webClient.Proxy = new WebProxy("myproxy.com");
result= webClient.DownloadString(someURL);
}
如果不确定,请尝试他的DNS-Testing链接。它不太可能,但如果浏览器使用的DNS与您的代码不同,则可能。
答案 1 :(得分:0)
在挖了一整天之后,今天我们联系了我们的网络部门解决了这个奇怪的问题,我们发现当我们使用桌面应用程序调用任何 SOAP 或 WCF 时服务请求通过代理服务器,但在 Windows服务的情况下,请求通过系统网关/防火墙,在防火墙端口 80 是被阻止,由于请求无法呼叫服务器。
当我们为服务特定网址打开端口80时,它开始正常运行。