我在公司的数据中心托管了一个简单的WCF SOAP服务,只有一个方法接收Guid(用于标识请求),并且不返回任何内容(void)。我们使用此方法作为服务从数据库加载其配置的信号。该服务是一个使用SOAP的自托管WCF,它作为WindowsService运行。
当用户更改与他相关的配置时,将从ASP.NET Web应用程序调用此服务。数据库已更新,并且调用该服务以加载其更新的设置。
问题是,此服务突然无法再从生产中的应用程序访问。我收到404错误,但是当从应用程序的机器中的浏览器打开WSDL时,它会正常加载。
尝试重现问题,我创建了控制台应用程序,只是为了从我的开发机器调用它,它可以工作。但是,如果我尝试从新的Web应用程序调用它,则会发生另一个问题:"连接尝试失败,因为连接方在一段时间后没有正确响应,或者由于连接的主机未能连接而建立的连接失败响应"
另外,如果我使用SoapUI或Visual Studio的WCF测试客户端进行呼叫,我可以毫无问题地连接。
对于所有测试,我使用相同的方法来创建客户端:创建服务引用(Visual Studio生成的代码工具)。用于调用服务的代码是这样的:
using (var client = new NotificatorClient())
{
var request = new NotifyRequest { RequestId = Guid.NewGuid() };
client.Notify(request); // Works from any project that is not a WebApplication
Label1.Text = "Notificated!";
}
对于所有客户端,我的web.config的system.ServiceModel部分是相同的(正如我所说,处理任何非WebApplication的事情):
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicHttpBinding_INotificator">
<security mode="Transport" />
</binding>
</basicHttpBinding>
</bindings>
<client>
<endpoint address="https://myservice.com"
binding="basicHttpBinding" bindingConfiguration="BasicHttpBinding_INotificator"
contract="MyAppNotificatorSvc.INotificator" name="BasicHttpBinding_INotificator" />
</client>
</system.serviceModel>
此外,这是我的服务合同,如果它有助于更好地了解可能发生的任何问题。
[ServiceContract]
public interface INotificator
{
[OperationContract]
void Notify(NotifyRequest request);
}
[DataContract]
public class NotifyRequest
{
[DataMember(Name = "RequestId", Order = 0, IsRequired = true)]
public Guid RequestId { get; set; }
}
我们使用带有TLS 1.2的HTTPS作为我们的请求安全协议,并尝试通过在WebApplication上调用此代码来更改它,但我仍然遇到同样的问题。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
我知道这可能听起来不是关于这个问题的真正相关信息,但这是迄今为止我所得到的。有没有人遇到过这类问题?关于可能发生什么的任何提示?