在web.config中添加配置时,webHttpBinding的WCF服务无法正常工作

时间:2012-04-13 07:17:33

标签: asp.net wcf web-services webhttpbinding

我有一个非常基本的WCF服务,我想在IIS上作为RESTful服务运行。这是服务合同。

[ServiceContract]
interface IRestCameraWs
{
   [OperationContract]
   [WebGet(UriTemplate = "/cameras/{username}",ResponseFormat = WebMessageFormat.Xml,
            BodyStyle = WebMessageBodyStyle.Wrapped)]
   CameraInfo[] GetUserCameras(string username);

   [OperationContract]
   [WebGet(UriTemplate = "/liveimage/{cameraId}",ResponseFormat = WebMessageFormat.Xml,
            BodyStyle = WebMessageBodyStyle.Wrapped)]
   byte[] GetLiveImage(int cameraId);

   //void GetLatestImage(int cameraId, out DateTime timestamp, out byte[] image);

   [OperationContract]
   [WebGet(UriTemplate = "/latestimage/{cameraId}", ResponseFormat = WebMessageFormat.Xml,
            BodyStyle = WebMessageBodyStyle.Wrapped)]
   string GetLatestImageUrl(int cameraId);
}

有一个类实现了这个名为StopMotion.Business.WCFService.RestCameraWs的合同。然后我在我的web项目中添加了一个.svc文件,其中包含以下标记。

<%@ ServiceHost Service="StopMotion.Business.WCFService.RestCameraWsBase"%>

当我导航到此服务网址时,它会向我显示服务主页和wsdl定义的链接。但是当我在web.config文件中添加配置以在webHttpBinding上配置此服务时,我从IIS express获得了以下错误页面。

enter image description here

首先,我认为我在配置方面做错了。后来我删除了配置,只是改变了svc文件中的工厂,如

<%@ ServiceHost Factory="System.ServiceModel.Activation.WebServiceHostFactory" Service="StopMotion.Business.WCFService.RestCameraWsBase"%>
据说

WebServiceHostFactory默认使用webHttpBinding,我们不需要在配置中添加它,除非我们需要更多的东西。但是更改工厂也导致IIS Express上出现相同的错误页面。

有什么想法在这里发生了什么?

2 个答案:

答案 0 :(得分:1)

在我的配置中,我记得我必须在web.config中声明终点并在行为中启用。部分结果看起来有点像:

    <endpoint address="json" binding="webHttpBinding" contract="svcservice.svc.IAuthsvc" bindingConfiguration="bc.svcservice.svc.AuthsvcJSON" behaviorConfiguration="epb.svcservice.svc.AuthsvcJSON"/>      
    .
    .
    .
    .
    <behavior name="epb.svcservice.svc.AuthsvcJSON">
      <enableWebScript/>
    </behavior>

希望这会有所帮助

答案 1 :(得分:0)

问题在于我的方法签名。我们只能包含string中包含UriTemplate类型的参数,而某些方法接受int类型的参数,如下所示。

[OperationContract]
        [WebGet(UriTemplate = "/latestimage/{cameraId}",ResponseFormat = WebMessageFormat.Xml,
            BodyStyle = WebMessageBodyStyle.Wrapped)]
        string GetLatestImageUrl(int cameraId);

当我在vs dev服务器上调试它时,它为我提供了错误,但似乎在IIS Express中观察错误更加困难,即使在开发环境中也是如此。