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异常.我不确定我错过了什么.
非常感谢提前.
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)
| 归档时间: |
|
| 查看次数: |
1342 次 |
| 最近记录: |