仅当部署到IIS

时间:2018-05-09 20:25:01

标签: c# iis asp.net-core asp.net-core-2.0 iis-express

我的家庭控制器从

成功返回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})
            })
    }
}

3 个答案:

答案 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应用程序:

  1. 在没有托管运行时配置的AppPoolIdentity下运行应用程序池设置

  2. 将ASP.NET Core 2网站发布到文件夹。默认情况下,它发布到bin \ Release \ PublishOutput

  3. 将IIS网站指向已发布的文件夹

答案 2 :(得分:0)

我在尝试访问网站的“帐户”控制器时遇到类似的问题,即收到404。其他所有Razor页面均能正常工作。如果我在web.config中将InheritedInChildApplications =“ false”更改为true,则控制器开始工作。

<?xml version="1.0" encoding="utf-8"?> <configuration> <location path="." inheritInChildApplications="true"> ... </configuration>