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>
我看过很多关于这个的帖子,但似乎找不到真正的答案。
[免责声明:我对 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>