在 Azure 应用程序网关后面托管 WCF 服务时如何获得正确的 WSDL URL?

How to get correct WSDL URL when hosting a WCF service behind an Azure Application Gateway?

我们正在将服务从本地迁移到 Azure,我们现在托管遗留 WCF 服务和 Azure 应用服务。为了使其向后兼容现有客户端,需要通过 {domainNameHere}.com/services.

提供。

还有其他服务应该可以通过同一域访问,例如 {domainNameHere}.com/api。我们已经设置了一个 Azure 应用程序网关来根据请求路径将请求路由到不同的应用程序服务,并设置 {domainNameHere}.com 指向应用程序网关 IP。

这适用于除 WCF 服务之外的所有服务。它可以在 https://{domainNameHere}.com/services/exports.svc 的浏览器中访问,但该页面上的 WSDL URI 显示 azurewebsites.net URI 而不是我们的自定义域。当客户端尝试访问该服务时,他们收到以下错误:

System.ServiceModel.EndpointNotFoundException:
'There was no endpoint listening at https://{domainNameHere}.com/services/export.svc
that could accept the message. This is often caused by an incorrect address or SOAP
action. See InnerException, if present, for more details.'

Inner Exception
WebException: The remote server returned an error: (404) Not Found.

我们已尝试在 WCF 配置中使用 useRequestHeadersForMetadataAddress 但无济于事。

这是 WCF 配置,全部在代码中。 endpoint URI 是 https://{domainNameHere}.com/services/exports.svc.

public static void Configure<T>(ServiceConfiguration config, Uri endpoint) where T : class
{
    // Configure service behavior
    config.Description.Behaviors.Add(new ServiceMetadataBehavior { HttpGetEnabled = true, HttpsGetEnabled = true });
    config.Description.Behaviors.Add(new ServiceDebugBehavior { IncludeExceptionDetailInFaults = true });

    var serviceCredential = config.Description.Behaviors.Find<ServiceCredentials>();
    if (serviceCredential == null)
    {
        serviceCredential = new ServiceCredentials();
        config.Description.Behaviors.Add(serviceCredential);
    }

    serviceCredential.UserNameAuthentication.UserNamePasswordValidationMode = UserNamePasswordValidationMode.Custom;
    serviceCredential.UserNameAuthentication.CustomUserNamePasswordValidator = new CredentialsValidator();

    config.AddServiceEndpoint(typeof(T), GetBinding(), endpoint);
}

我终于明白了。应用程序网关使用 HTTP 向 WCF 服务发出请求,但 WCF 服务仅在 HTTPS 上回复。一旦我更新了应用程序网关以使用 HTTPS 发出请求,它就按预期工作了。