IIS中的ServiceStack部署(404例外)

use*_*400 6 .net c# asp.net iis servicestack

我已经在Stackoverflow上看了很多关于ServiceStack的问题并且实际上用完了选项.花了很多时间并尝试了很多选项,但无法在IIS中运行我的ServiceStack服务.

我在默认网站名下有一个虚拟目录,api指向它的物理位置是ServiceStack程序集的bin目录.

只是为了测试我已经index.htm在bin文件夹中放了一个.当我导航到时localhost/api,我从bin文件夹中获取index.htm的内容.

但是,正如您在下面的代码中看到的那样,我的客户端调用ServiceStack服务会JSONServiceClient导致404异常.我不确定我错过了什么.

非常感谢提前.

  • 服务堆栈版本:3.9.69.0
  • IIS 8.0版

using System.Configuration;
using ServiceStack.OrmLite;
using ServiceStack.OrmLite.SqlServer;

//  logging
using ServiceStack.Logging;

//  Service Interface project
public class xxxService   : Service
{
    public List<xxxResponse> Get(xxxQuery xxxQuery) 
}

[Route("/xxxFeature/{xxxSerialNo}/{xxxVersion}")]
public class xxxQuery : IReturn<List<xxxResponse>>
{
    public string xxxSerialNo { get; set; }
    public string xxxVersion { get; set; }
    public string xxxId { get; set; }
    public string xxxName { get; set; }
}

public class xxxResponse
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string Version { get; set; }
    public string Size { get; set; }
    public ResponseStatus ResponseStatus { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Web.config文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
  </configSections>
  <system.web>
    <compilation debug="true" targetFramework="4.5" />
    <httpRuntime targetFramework="4.5" />
  </system.web>
  <location path="api"> 
    <system.web>
      <httpHandlers>
        <add path="*" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" />
      </httpHandlers>
      <authorization>
        <allow users="*" />
      </authorization>
    </system.web>
    <!-- Required for IIS7 -->
    <system.webServer>
      <modules runAllManagedModulesForAllRequests="true" />
      <validation validateIntegratedModeConfiguration="false" />
      <handlers>
        <add path="*" name="ServiceStack.Factory" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true" />
      </handlers>
    </system.webServer>
  </location>
  <system.webServer>
    <directoryBrowse enabled="false" />
  </system.webServer>
</configuration>
Run Code Online (Sandbox Code Playgroud)

的Global.asax.cs

public class Global : System.Web.HttpApplication
{
    public class xxxServiceAppHost : AppHostBase
    {
        public xxxServiceAppHost() : base("xxx Services", typeof(xxxService).Assembly)
        {
            ServiceStack.Logging.LogManager.LogFactory = new Log4NetFactory(true);
            Log4NetUtils.ConfigureLog4Net(ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["ServerDB"]].ConnectionString);
        }

        public override void Configure(Funq.Container container)
        {
            container.Register<IDbConnectionFactory>(c => new OrmLiteConnectionFactory(ConfigurationManager.ConnectionStrings[ConfigurationManager.AppSettings["ServerDB"]].ConnectionString, SqlServerDialect.Provider));
            SetConfig(new EndpointHostConfig { ServiceStackHandlerFactoryPath = "api" });
        }
    }
Run Code Online (Sandbox Code Playgroud)

也尝试过routes.ignore评论为了避免与ASP.NET MVC冲突,添加忽略规则Global.asax.RegisterRoutes方法,例如:routes.IgnoreRoute ("api/{*pathInfo}");

    public void RegisterRoutes(RouteCollection routes)
    {
        routes.Ignore("api/{*pathInfo}");
    }

    protected void Application_Start(object sender, EventArgs e)
    {
        new xxxServiceAppHost().Init();
    }
}
Run Code Online (Sandbox Code Playgroud)

客户端调用.我也试过,..../api/api因为我在IIS上的vdir是api.

try
{
    xxxServiceClient = new JsonServiceClient("http://111.16.11.111/api");
    List<xxxResponse> xxxResponses = xxxServiceClient.Get(new xxxQuery { xxxSerialNo = "22222", xxxVersion = "0.0" });
}
catch (WebServiceException excp)
{
    throw excp;
}
Run Code Online (Sandbox Code Playgroud)

小智 4

在我看来,您可以使用 web.config 尝试一些事情。您不需要在服务器上有虚拟目录。根据您使用的 IIS 版本,您可能仍然需要 httpHandlers 和 handlers 配置部分。我看到您将 ServiceStack 的配置设置嵌套在位置 path="api" 中。这可能对您所需的安全要求以及您拥有“api”虚拟目录的原因有意义。您可以尝试不使用该位置元素。

尝试以下操作:删除 location 元素并将设置与其他配置部分(system.web...等)合并,删除 httpHandlers 部分,保留处理程序部分,并将处理程序配置更改为具有“api*.xml”路径。

这会将 url 映射到服务,因此当您转到 localhost:12345/api/metadata 时,您应该会看到您的服务。如果您看不到元数据页面,您就知道出了问题。

无论 web.config 更改如何,您的服务代码都存在问题。你的代码似乎有一些地方不对劲。您的请求对象(xxxQuery)应该是一个带有路由属性的简单 POCO。Get 服务需要将该对象作为其参数。如果您要返回该属性,则响应应实现 IHasResponseStatus。

<handlers>
    <add path="api*" name="ServiceStack.Factory" type="ServiceStack.WebHost.Endpoints.ServiceStackHttpHandlerFactory, ServiceStack" verb="*" preCondition="integratedMode" resourceType="Unspecified" allowPathInfo="true"/>
</handlers>

//  Service Interface project
public class xxxService   : Service
{
    public xxxResponse Get(xxxQuery xxxQuery)
    { 
        //return object of type xxxResponse after doing some work to get data
        return new xxxResponse();
    } 
}

[Route("/xxxFeature/{xxxSerialNo}/{xxxVersion}")]
public class xxxQuery
{
    public string xxxSerialNo { get; set; }
    public string xxxVersion { get; set; }
    public string xxxId { get; set; }
    public string xxxName { get; set; }
}

public class xxxResponse : IHasResponseStatus
{
    public xxxResponse()
    {
        // new up properties in the constructor to prevent null reference issues in the client
        ResponseStatus  = new ResponseStatus();
    }

    public int ID { get; set; }
    public string Name { get; set; }
    public string Version { get; set; }
    public string Size { get; set; }
    public ResponseStatus ResponseStatus { get; set; }
}
Run Code Online (Sandbox Code Playgroud)