gpt4 book ai didi

c# - IIS中ServiceStack部署(404异常)

转载 作者:太空狗 更新时间:2023-10-29 21:44:50 26 4
gpt4 key购买 nike

我对 Stackoverflow 上的 ServiceStack 问题进行了很多研究,但确实没有选择。花了很多时间并尝试了很多选项,但无法在 IIS 中运行我的 ServiceStack 服务。

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

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

然而,正如您在下面的代码中看到的,我的客户端通过 JSONServiceClient 调用 ServiceStack 服务导致 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; }
}

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>

全局.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" });
}
}

还尝试使用 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();
}
}

客户端调用。我也尝试过 ..../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;
}

最佳答案

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

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

这会将 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; }
}

关于c# - IIS中ServiceStack部署(404异常),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21056042/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com