我的家庭控制器从
成功返回index.html
http://localhost/
和
http://localhost/controller/
但如果我试图点击
http://localhost/controller/method/
我得到404
即使该方法在IIS express中正常工作。
无法在网上找到任何有类似问题的人,其中只有控制器上的方法不适用于某个特定部署,但控制器本身也没问题。
我尝试的一些事情在IIS部署的许多.Net Core 2.0问题中很常见:
确保在项目设置和IIS中启用了Windows身份验证(我已经打开和关闭它无法使用我在网络应用上没有用户身份验证,所以我不知道#39;认为这对我很重要。)
将我的应用程序池切换为No managed code
版本使用CLR
将应用程序池ID更改为LocalSystem
更改发布输出文件夹的权限以包含%hostname%\IIS_IUSRS
非常确定我还尝试了很多其他基本的故障排除,有时可以解决问题。 I.E.删除和读取应用程序。再次开启和关闭无济于事。
任何建议如何解决这个问题都是非常受欢迎的。
我还想注意它昨天有效,并且不记得更改除发布输出之外的任何内容以使用Debug
而不是Release
当然我现在已经使用Release
改回public class MyController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpPost]
public void Store([FromBody]MyObject obj)
{
Console.WriteLine(Request.Body);
//Some code
}
[HttpGet]
public void Check(string objectUID, string idfv)
{
Console.WriteLine($"ObjectUID: {objectUID}");
Console.WriteLine($"IDFV: {idfv}");
//some other code
}
[HttpGet]
public MyObject Retrieve(string objectUID)
{
Console.Writeline($"ObjectUID: {objectUID}");
//Some Code
}
}
但仍然没有运气。
这是一些代码
app.UseMvc(routes =>
{
routes.MapRoute(
name: "default",
template: "{controller=MyController}/{action=Index}/{id?}");
});
这是我的路线。
export function publishRouting(routingID, versionID, un, values){
const url = `${ROOT_ROUTINGS_URL}/${routingID.trim()}/${versionID.trim()}/publish?username=${un}`;
console.log("publish url:::",url);
return dispatch => {
dispatch({type: PUBLISH_ROUTING_LOADING, isLoading:true});
dispatch(updateValuesRouting(values, routingID)).then(
setTimeout(() => {
axios.put(url)
.then(({data}) => {
console.log("publish data returned:::", data);
dispatch(alertMessage("success", `${routingID} has been published!`));
dispatch(goToRouting(data.routingID, "000", history));
//window.location.reload();
dispatch({type: PUBLISH_ROUTING_SUCCESS, data}) ;
})
.catch((err) => {
dispatch(alertMessage("danger", `${routingID} failed with the following: ${err}`));
dispatch({type: PUBLISH_ROUTING_FAILURE, isCheckedOut: false, err})
console.log("publish error:", err);
})
}, 500)
);
};
}
export function updateValuesRouting(values, routingID ){
const url = `${ROOT_ROUTINGS_URL}/${routingID.trim()}/editing/meta`;
console.log("routing url:: ",url, values);
return dispatch => {
dispatch({type: UPDATE_VALUE_ROUTING_LOADING, isLoaded: false});
return axios.put(url, values)
.then(({data}) => {
console.log("returned values from updateValuesRouting:",data);
let myKeys = Object.keys(data);
let ind;
ind= myKeys.findIndex((x)=>{return x === 'headers'});
myKeys.splice(ind, 1);
ind= myKeys.findIndex((x)=>{return x === 'lastEditedDate'});
myKeys.splice(ind, 1);
ind= myKeys.findIndex((x)=>{return x === 'routingEditorMetaKey'});
myKeys.splice(ind, 1);
myKeys = myKeys.toString();
dispatch(alertMessage("success", `${routingID} has updated ${myKeys}!`));
dispatch({type: UPDATE_VALUE_ROUTING, data, isLoaded:true});
return Promise.resolve();
})
.catch((err) => {
dispatch(alertMessage("danger", `${routingID} has not updated values. ${err}`));
dispatch({type: UPDATE_VALUE_ROUTING_FAILURE, isLoaded: true})
})
}
}
答案 0 :(得分:0)
如果您不确定为什么它不起作用,请尝试使用docs for $.ajax()
中解释的属性路由
然后你可以这样试试:
[Route("[controller]/[action]")]
public class MyController : Controller
{
public IActionResult Index()
{
return View();
}
[HttpPost]
public void Store([FromBody]MyObject obj)
{
Console.WriteLine(Request.Body);
//Some code
}
// If you have a parameter from the uri or query-string, you can add it to the Template this way
[HttpGet("{objectUID} ")]
public void Check(string objectUID, string idfv)
{
Console.WriteLine($"ObjectUID: {objectUID}");
Console.WriteLine($"IDFV: {idfv}");
//some other code
}
// Or optional parameter like this
[HttpGet ("{objectUID?} ")]
public MyObject Retrieve(string objectUID)
{
Console.Writeline($"ObjectUID: {objectUID}");
//Some Code
}
}
答案 1 :(得分:0)
由于您收到404错误,我怀疑您的网站缺少aspnet核心处理程序。假设您已安装.NET Core Hosting Bundle, 确保在web.config文件中添加了以下处理程序。如果缺少web.config文件,请添加新的web.config。此外,在网站根文件夹中添加日志文件夹以进行日志记录。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<!-- To customize the asp.net core module uncomment and edit the following section.
For more info see https://go.microsoft.com/fwlink/?linkid=838655 -->
<system.webServer>
<handlers>
<remove name="aspNetCore"/>
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified"/>
</handlers>
<aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" />
</system.webServer>
</configuration>
我按照以下步骤在我的机器上运行了ASP.NET Core 2应用程序:
在没有托管运行时配置的AppPoolIdentity下运行应用程序池设置
将ASP.NET Core 2网站发布到文件夹。默认情况下,它发布到bin \ Release \ PublishOutput
将IIS网站指向已发布的文件夹
答案 2 :(得分:0)
我在尝试访问网站的“帐户”控制器时遇到类似的问题,即收到404。其他所有Razor页面均能正常工作。如果我在web.config中将InheritedInChildApplications =“ false”更改为true,则控制器开始工作。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<location path="." inheritInChildApplications="true">
...
</configuration>