顯示具有 錯誤訊息 標籤的文章。 顯示所有文章
顯示具有 錯誤訊息 標籤的文章。 顯示所有文章

2018年5月20日 星期日

service unavailable http error 503. the service is unavailable

開啟網站時發生異常

service unavailable http error 503. the service is unavailable

前一次開啟剛網站時還正常

Windows 10 更新以後,開啟架設在IIS上的網站(ASP.NET Core 2.0)時發生錯誤的訊息,搜尋一下得知是這個網站的 ApplicationPool 是[停用]狀態,啟用以後執行網站,還是出現同樣異常,ApplicationPool 又變成[停用]狀態,用事件檢視器查看來源為[IIS AspNetCore Module]的資訊,發現下面這則訊息

無法載入 C:\WINDOWS\System32\inetsrv\iiswsock.dll 

前幾天開發時有用到 WebSocket,也能正常使用。開啟[開啟或關閉 Windows 功能],點開[Internet Infomation Services]>[World Wide Web 服務]>[應用程式開發功能]發現之前已經勾選的[WebSocket通訊協定]是未選取狀態,勾選以後問題就解決了。

2014年7月30日 星期三

取得更新失敗的詳細原因

1. 驗證不過的原因

public ActionResult Create(TopicCategory model)
{
    if (ModelState.IsValid)
    {
        _db.TopicCategory.Add(model);
        _db.SaveChanges();
        return Json(new { status = "success", information = model.Id });
    }
    else
    {
        string messages = string.Join("; ", ModelState.Values
                                .SelectMany(x => x.Errors)
                                .Select(x => x.ErrorMessage));
        return Json(new { status = "error", information = messages });
    }   
}  

2. EF SaveChanges()失敗原因

try
{
    _db.SaveChanges();
}
catch (DbEntityValidationException dbEx)
{
    foreach (var validationErrors in dbEx.EntityValidationErrors)
    {
        foreach (var validationError in validationErrors.ValidationErrors)
        {
            Trace.TraceInformation("Property: {0} Error: {1}", validationError.PropertyName, validationError.ErrorMessage);
        }
    }
}
or
try
{
    // Your code...
    // Could also be before try if you know the exception occurs in SaveChanges
    _db.SaveChanges();
}
catch (System.Data.Entity.Validation.DbEntityValidationException e)
{
    foreach (var eve in e.EntityValidationErrors)
    {
        Console.WriteLine("Entity of type \"{0}\" in state \"{1}\" has the following validation errors:",
            eve.Entry.Entity.GetType().Name, eve.Entry.State);
        foreach (var ve in eve.ValidationErrors)
        {
            Console.WriteLine("- Property: \"{0}\", Error: \"{1}\"",
                ve.PropertyName, ve.ErrorMessage);
        }
    }
    throw;
}

2014年1月28日 星期二

Validation failed for one or more entities. See 'EntityValidationErrors' property for more details.

錯誤訊息 : 


可能某個不可為null的欄位, 填入了null, 但是不知道是哪個欄位, 因此使用try catch來捕抓錯誤

            try
            {
                _db.SaveChanges();
            }
            catch (DbEntityValidationException dbEx)
            {
                foreach (var validationErrors in dbEx.EntityValidationErrors)
                {
                    foreach (var validationError in validationErrors.ValidationErrors)
                    {
                        Trace.TraceInformation("Property: {0} Error: {1}"validationError.PropertyNamevalidationError.ErrorMessage);
                    }
                }
            }

按下F5執行 : 

在偵錯模式下追蹤到的自訂錯訊息(紅字)





2014年1月26日 星期日

名稱 'Styles' 不存在於目前內容中

The Name 'Scripts' Does Not Exist in the Current Context


在MVC空白範本時, 因為沒有 Layout.cshtml , 所以就自己新增了一個, 並加入了 @Style 或是 @Script, 例如 : 
@Scripts.Render("~/bundles/jqueryval")

執行時發生錯誤 :
名稱 'Styles' 不存在於目前內容中

解決方法 : 
  1. 刪除 @Style 和 @Script 程式碼
  2. 用其他的範本(例如網際網路範本)
  3. 安裝Optimization
  • Step 1 : 用 NuGet 安Optimization
    打開 [工具>程式庫套件管理員>套件管理器主控台] 執行
    PM> Install-Package Microsoft.Web.Optimization -Pre
    內容 : http://www.nuget.org/packages/Microsoft.Web.Optimization
  • Step 2: 在 config 檔案裡面加入 namespace reference
    以下兩個Web.config都要加入 : 

    根目錄下的 Web.config : 

    <configuration>
      <system.web>
        <pages>
          <namespaces>
            <add namespace="System.Web.Optimization" />
          </namespaces>
        </pages>
      </system.web>
    </configuration>

    Views 資料夾下的Web.config : 
    <configuration>
      <system.web.webPages.razor>
        <pages pageBaseType="System.Web.Mvc.WebViewPage">
          <namespaces>
            <add namespace="System.Web.Optimization" />
          </namespaces>
        </pages>
      </system.web.webPages.razor>
    </configuration>


現在可以正常執行了

2013年9月12日 星期四

C#的Model資料要給AngularJs使用時發生錯誤:序列化 '類型名稱' 型別的物件時偵測到循環參考。

【在Asp.Net MVC中練習使用AngularJs
        public ActionResult Index()
        {
            var user = _db.UserProfile.ToList();
            return View(user.ToList());
        }
傳到view時因為資料要給AngularJs$scope使用,所以要轉成json格式,因此:
var userData = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(Model);

但是發生錯誤:

序列化 'System.Data.Entity.DynamicProxies.UserProfile_CEE82D32FCD691626A61F42769FECEA9AB07909986AD7E4D856A9F08F03065F4' 型別的物件時偵測到循環參考。

看起來在物件層級中有循環參考(某個欄位參考另一個資料表),因此要選擇要用的欄位,且非導覽欄位,完整程式如下


@model IEnumerable<HappyMovieAngularJs.Models.UserProfile>
@{
    var user = Model.Select(x => new { x.UserId, x.NickName, x.UserName });
    var userData = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(user);
}
<script>
    var myApp = angular.module('myApp', []);
    myApp.controller('AppCtrl', function ($scope) {
        $scope.users = JSON.parse('@Html.Raw(userData)');
    });
</script>
<div data-ng-app="myApp">
    <div data-ng-controller="AppCtrl">
        <table>
            <tr data-ng-repeat="user in users">
                <td>{{user.UserId}}</td>
                <td>{{user.NickName}}</td>
                <td>{{user.UserName}}</td>
            </tr>
        </table>
    </div>

</div>

2013年7月14日 星期日

找不到必要的 .Net Framework Data Provider。可能尚未安裝。

建立一個新的網際網路應用程式,想要使用原本已經建立好的資料庫時,我在專案上加入了【ADO.NET 實體資料模型】(Entity Framework)並連結到要使用的資料庫

























確定後在web.config產生連結字串











以上為 database-first
----------------------------------------------------------------

在指定的資料庫裏面有一個資料表Users,想要讓WebSecurity使用時修改了
WebSecurity.InitializeDatabaseConnection("DefaultConnection""UserProfile""UserId""UserName", autoCreateTables: true);
WebSecurity.InitializeDatabaseConnection("TestDbEntities""Users""UserId""UserName", autoCreateTables: true);

我將預設產生的DefaultConnection改為TestDbEntities是,並將UserProfile資料表改為Users

開始執行網站,當執行到上面這段修改過的程式時, 發生錯誤:

找不到必要的 .Net Framework Data Provider。可能尚未安裝。


看來membership服務認不出entity framework的連結字串,因此將連結字串改回用DefaultConnection,並修改內容:
<add name="DefaultConnection" connectionString="Data Source=(LocalDb)\v11.0;Initial Catalog=TestDb;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />



2013年6月29日 星期六

在ASP.NET MVC4使用預設的User Roles

新增一個網際網路應用程式,打開 AccountController並看看註冊action
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult Register(RegisterModel model)
{
    if (ModelState.IsValid)
    {
     // 嘗試註冊使用者
        try
        {
            WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
            WebSecurity.Login(model.UserName, model.Password);
            return RedirectToAction("Index""Home");
        }
        catch (MembershipCreateUserException e)
        {
            ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
            }
        }

        // 如果執行到這裡,發生某項失敗,則重新顯示表單
        return View(model);
}

這裡少了對新的使用者指派腳色設定,在 WebSecurity.CreateUserAndAccount() 後面加入
if (!Roles.RoleExists("user"))
{
    Roles.CreateRole("user");
}
Roles.AddUserToRole(model.UserName, "user");

之後可以再Action上面加入
[Authorize(Roles = "admin")]

或是在程式或是View裡面判斷
if (Roles.IsUserInRole("admin")){}

---------------------------------------------------------

當在別的Controller裡面的Action加入[Authorize(Roles = "admin")] 會出現錯誤 :
建立連接至 SQL Server 時,發生網路相關或執行個體特定的錯誤。找不到或無法存取伺服器。確認執行個名稱是否正確,以及 SQL Server 是否設定為允許遠端連線。 (provider: SQL Network Interfaces, error: 26 - 搜尋指定的伺服器/執行個體時發生錯誤)

因為使用SimpleMembership的資料庫還未初始化,可以在Controller上加入 
[InitializeSimpleMembership] 即可(預設只有AccountController有加入該屬性)

或是想要在應用程式啟動時就初始化可以在Global.asax 加入
WebSecurity.InitializeDatabaseConnection("DefaultConnection""UserProfile""UserId""UserName", autoCreateTables: true);

如果指示發生錯誤在:
// 請確定一個應用程式啟動只起始一次 ASP.NET Simple Membership
LazyInitializer.EnsureInitialized(ref _initializer, ref _isInitialized, ref _initializerLock);

頁面顯示錯誤訊息為:
"WebSecurity.InitializeDatabaseConnection" 方法只能呼叫一次。

將該檔案(Filters/InitializeSimpleMembershipAttribute.cs)內的WebSecurity.InitializeDatabaseConnection()方法移除

---------------------------------------------------------
取的目前使用者的角色(陣列)
string[] roles = Roles.GetRolesForUser()

判斷角色
bool isAdmin = Roles.IsUserInRole("admin")