WCF 服务在本地工作,但在服务器上提供 404

WCF Service works locally but gives 404 on server

我看过很多关于这个的帖子,但似乎找不到真正的答案。

[免责声明:我对 WCF 了解不多 -- 虽然我可以访问代码,但这是我正在尝试连接的现有项目。]

我创建了一个 html/javascript 客户端来访问现有的 WCF 服务 API。每个都是一个单独的应用程序,所以当我在本地 运行 时,客户端和服务器都在 localhost 上 运行ning 但具有不同的端口号。这行得通。客户端应用程序能够通过如下调用调用 WCF 服务:https://localhost:4435/sessions.svc/getsession?sessionPK=3

当我在一台服务器上安装这两个应用程序时(都 运行ning 在同一台服务器上作为不同的虚拟应用程序),该服务确实 运行ning -- 我可以点击 https://myserver.com/api/sessions.svc 从网络浏览器,我从服务返回一个页面,告诉我它正在工作。

但是,现在当客户端尝试以与在本地 (https://myserver.com/api/sessions.svc/getsession?sessionPK=3) 相同的方式访问服务时,我收到 404 Not Found 错误。

客户端和 WCF 服务都托管在具有相同根域的同一台服务器上——因此 CORS 应该不是问题。

以下是一些代码片段:

** WCF 服务 **

[ServiceContract]
public interface ISessions
{
    [OperationContract]
    [WebInvoke(Method = "GET", RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped)]
    string GetSession(int? sessionPK);

    [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
    public class Sessions : BaseService, ISessions
    {
        public string GetSession(int sessionPK)
        {
          ...
        }
}

** Web.Config 服务 **

<service behaviorConfiguration="BehaviorConfig" name="Sessions">
  <endpoint address="" binding="webHttpBinding" behaviorConfiguration="json"  contract="ISessions">
    <identity>
      <dns value="localhost"/>
    </identity>
  </endpoint>
  <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
</service>

** 客户 **

export class DataService {

   constructor(private http : HttpClient){
     this.http.configure(config => {
      config.withBaseUrl("https://myserver.com/api/");
      config.withHeader("Accept", "application/json");
      config.withHeader("Content-Type", "application/json");
      config.withCredentials(true);
    })
  }

  public async getSessionById(id : number = 0){
    try{
       let result = this.http.get(`sessions.svc/getsession?sessionPK=${id}`);
       if(!result.isSuccess)
          throw response;

       ...
    }
    catch(error : any){
       ...
    }
}

更新

作为对 Peter 的回应,我从 https://myserver.com/api/sessions.svc 得到了与 https://myserver.com/api/sessions.svc?wsdl 相同的回应。这是一个这样的页面:

该服务似乎没有 return 它公开的操作列表。顺便说一句,它在 localhost.

上的执行方式完全相同

如果CORS没有问题,你接入服务的URI或者格式可能是wrong.You可以打开服务中的帮助文档看看如何请求接口:

        <endpointBehaviors>
            <behavior name="ESEndPointBehavior">
                <webHttp helpEnabled="true"/>
            </behavior>
        </endpointBehaviors>

访问帮助文档:

这是服务接口的设计:

      [OperationContract]
    [WebGet(UriTemplate = "user/?name={name}",RequestFormat = WebMessageFormat.Json, ResponseFormat = WebMessageFormat.Json)]
    Result GetUserData(string name);

我没有把bodystyle设置成WebMessageBodyStyle.Wrapped因为WebMessageBodyStyle.Wrapped主要是用来封装body的,但是get里面没有bodymethod.Andset"WebMessageBodyStyle.Wrapped"的帮助文档不会生成正确的请求 format.It 会是这样的:

正常的帮助文档应该是这样的:

它包含请求的 URI 和格式。

原来,我在本地是 运行 HTTP,在服务器上是 HTTPS。我通过添加以下内容解决了我的问题:

 <webHttpBinding>
   <binding>
     <security mode="Transport"></security>
   </binding>
 </webHttpBinding>