加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 服务有时仅抛出No’Access-Control-Allow-Origin’标头错

发布时间:2020-12-15 22:10:23 所属栏目:百科 来源:网络整理
导读:我有一个服务有几种方法.我设置我的Global.asax文件来处理CORS,并且所有东西都工作得很好,包括CORS ……直到我在接口文件中添加了以下内容: [OperationContract][WebInvoke(UriTemplate = "/Transform",Method = "POST",ResponseFormat = WebMessageFormat.
我有一个服务有几种方法.我设置我的Global.asax文件来处理CORS,并且所有东西都工作得很好,包括CORS ……直到我在接口文件中添加了以下内容:

[OperationContract]
[WebInvoke(UriTemplate = "/Transform",Method = "POST",ResponseFormat = WebMessageFormat.Json)]
bool XXXTransform(string user,string x);

以及服务类的以下内容……

bool XXXTransform(string user,string x)
{
    return true;
}

现在,这是非常有趣的事情.当我调用GetRecipes方法时发生错误.更有趣的是,如果我只为接口和服务类的XXXTransform指定了一个参数,它就不会抛出错误 – 如bool XXXTransform(string user)

有没有人见过这样的事情呢?为什么使用一个参数可以工作,但是在调用完全不同的方法时,两个参数会导致原始错误?

IChomp.cs:

namespace NomNomNotebookService
{
    // May need to mod service behavior for upload...
    [ServiceContract]
    public interface IChomp
    {
        [OperationContract]
        [WebInvoke(UriTemplate = "/{userId}/Recipes",Method = "GET",ResponseFormat = WebMessageFormat.Json)]
        List<Recipe> GetRecipes(string userId);

        [OperationContract]
        [WebInvoke(UriTemplate = "/{userId}/Recipes",BodyStyle = WebMessageBodyStyle.WrappedRequest,RequestFormat = WebMessageFormat.Json,ResponseFormat = WebMessageFormat.Json)]
        Recipe AddRecipe(string userId,Recipe recipe);

        [OperationContract]
        [WebInvoke(UriTemplate = "/{userId}/Recipes/{recipeId}",ResponseFormat = WebMessageFormat.Json)]
        Recipe UpdateRecipe(string userId,string recipeId,Method = "DELETE",ResponseFormat = WebMessageFormat.Json)]
        bool DeleteRecipe(string userId,string recipeId);

        [OperationContract]
        [WebInvoke(UriTemplate = "/{userId}/Recipes/{recipeId}",ResponseFormat = WebMessageFormat.Json)]
        Recipe GetRecipe(string userId,string recipeId);

        [OperationContract]
        [WebInvoke(UriTemplate = "/Categories",ResponseFormat = WebMessageFormat.Json)]
        List<Category> GetCategories();

        [OperationContract]
        [WebInvoke(UriTemplate = "/Upload",ResponseFormat = WebMessageFormat.Json)]
        bool XXXUpload();

        [OperationContract]
        [WebInvoke(UriTemplate = "/Transform",ResponseFormat = WebMessageFormat.Json)]
        bool XXXTransform(string user,string x); // WILL work if I have bool XXXTransform(string user)
    }
}

Chomp.cs

namespace NomNomNotebookService
{
    public class Chomp : IChomp
    {
        private DBConnector _dbCon = new DBConnector();

        public List<Recipe> GetRecipes(string userId)
        {
            _dbCon.Parameters.Add(new CustSqlParam("@userId",Int16.Parse(userId)));
            DataTable dt = _dbCon.RunProc("J_NNN_GetRecipesForUser");

            List<Recipe> recipes = new List<Recipe>();
            foreach (DataRow row in dt.Rows)
            {
                recipes.Add(new Recipe((int)row["Uid"],(string)row["Name"],(string)row["Description"],(string)row["Category"]));
            }

            _dbCon.Kill();

            return recipes;
        }

        public Recipe GetRecipe(string userId,string recipeId)
        {
            _dbCon.Parameters.Add(new CustSqlParam("@uid",Int16.Parse(recipeId)));
            DataTable dt = _dbCon.RunProc("J_NNN_GetRecipe");

            Recipe recipe = new Recipe(dt.Rows[0]);
            _dbCon.Kill();

            return recipe;
        }

        // USER ID IS HERE FOR VALIDATION ONCE SESSIONS ARE ROLLING
        public Recipe AddRecipe(string userId,Recipe recipe)
        {
            _dbCon.Parameters.Add(new CustSqlParam("@userId",Int16.Parse(userId)));
            _dbCon.Parameters.Add(new CustSqlParam("@name",recipe.Name));
            _dbCon.Parameters.Add(new CustSqlParam("@description",recipe.Description));
            _dbCon.Parameters.Add(new CustSqlParam("@categoryId",recipe.Category.Uid));
            _dbCon.Parameters.Add(new CustSqlParam("@prepTime",recipe.PrepTime));
            _dbCon.Parameters.Add(new CustSqlParam("@cookTime",recipe.CookTime));
            _dbCon.Parameters.Add(new CustSqlParam("@readyTime",recipe.ReadyTime));

            DataTable dt = _dbCon.RunProc("J_NNN_AddRecipe");
            _dbCon.Kill();
            return new Recipe(dt.Rows[0]);
        }

        public Recipe UpdateRecipe(string userId,Recipe recipe)
        {
            _dbCon.Parameters.Add(new CustSqlParam("@uid",Int16.Parse(recipeId)));
            _dbCon.Parameters.Add(new CustSqlParam("@name",recipe.ReadyTime));

            DataTable dt = _dbCon.RunProc("J_NNN_UpdateRecipe");
            _dbCon.Kill();
            return new Recipe(dt.Rows[0]);
        }

        public bool DeleteRecipe(string userId,string recipeId)
        {
            try
            {
                _dbCon.Parameters.Add(new CustSqlParam("@uid",Int16.Parse(recipeId)));
                DataTable dt = _dbCon.RunProc("J_NNN_DeleteRecipe");
                _dbCon.Kill();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.ToString());
                return false;
            }
            return true;
        }

        public List<Category> GetCategories()
        {
            DataTable dt = _dbCon.RunProc("J_NNN_GetCategories");
            _dbCon.Kill();

            List<Category> categories = new List<Category>();
            foreach (DataRow row in dt.Rows)
            {
                categories.Add(new Category((int)row["Uid"],(string)row["Name"]));
            }

            return categories;
        }

        // Upload shit....
        public bool XXXUpload()
        {
            return false;
        }

        public bool XXXTransform(string user,string x) // WILL work if I have bool XXXTransform(string user)
        {

            return true;
        }
    }
}

Global.asax中

namespace NomNomNotebookService
{
    public class Global : System.Web.HttpApplication
    {
        protected void Session_Start(object sender,EventArgs e)
        {
            HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin","*");
            if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
            {
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods","GET,POST,PUT,DELETE");
                HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers","Content-Type,Accept");
                HttpContext.Current.Response.AddHeader("Access-Control-Max-Age","1728000");
                HttpContext.Current.Response.End();
            }
        }
    }
}

解决方法

我过去也遇到过类似的错误.您是否在配置中设置了请求标头?

'Access-Control-Allow-Methods','GET,DELETE,OPTIONS'
'Access-Control-Allow-Headers','Content-Type,Authorization,Content-Length,X-Requested-With'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读