Home php c# sql c c++ javascript python java go android git linux asp.net django .net node.js ios xcode cocoa iphone mysql tomcat mongodb bash objective-c scala visual-studio apache elasticsearch jar eclipse jquery ruby-on-rails ruby rubygems android-studio spring lua sqlite emacs ubuntu perl docker swift amazon-web-services svn html ajax xml java-ee maven intellij-idea rvm macos unix css ipad postgresql css3 json windows-server vue.js typescript oracle hibernate internet-explorer github tensorflow laravel symfony redis html5 google-app-engine nginx firefox sqlalchemy lucene erlang flask vim solr webview facebook zend-framework virtualenv nosql ide twitter safari flutter bundle phonegap centos Register | Login | Edit Tags | New Questions | 繁体 | 简体


10 questions online user: 19

0
votes
answers
52 views
+10

如何確定從另一個線程創建哪個線程?

1

.NET中是否有任何方法來確定其「父」,即創建它的線程?如何確定從另一個線程創建哪個線程?

我在診斷黑盒第三方API的時間問題,並想了解它在哪個線程上執行的自定義代碼。

沙发
0
0

Kindof 如果您使用像PostSharp這樣的工具(您必須實現一個方面),您可以確定在哪個線程上調用了Start()方法。

0
votes
answers
8 views
+10

VB.net BackGroundWorker在DataGridView中交叉線程

0

我有一個BackGroundWorker,可以在DataGridView中查看mySQL中的數據。在我的DoWork事件VB.net BackGroundWorker在DataGridView中交叉線程

connection() 
    Try 
     conn.Open() 
     Dim query As String 
     query = "SELECT column02 AS 'Company ID', column05 AS Lastname, 
         column06 AS Firstname, column07 AS Middlename, 
         column04 AS 'Contact No.', column13 AS 'Area' 
       FROM table01 
       WHERE column10 = '" & selectedAccount & "' 
       AND column18 = 'Yes'" 
     command = New MySqlCommand(query, conn) 
     dataAdapter.SelectCommand = command 
     dataAdapter.Fill(dataTable) 
     bSource.DataSource = dataTable 
     DataGridView_Accounts.DataSource = bSource 
     For i As Integer = 0 To dataTable.Rows.Count - 1 
      dataTable.Rows(i)("Company ID") = dataTable.Rows(i)("Company ID") 
      dataTable.Rows(i)("Lastname") = dataTable.Rows(i)("Lastname") 
      dataTable.Rows(i)("Firstname") = dataTable.Rows(i)("Firstname") 
      dataTable.Rows(i)("Middlename") = dataTable.Rows(i)("Middlename") 
      dataTable.Rows(i)("Contact No.") = dataTable.Rows(i)("Contact No.") 
      dataTable.Rows(i)("Area") = dataTable.Rows(i)("Area") 
     Next 
     conn.Close() 
    Catch ex As Exception 
     MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error) 
    Finally 
     conn.Dispose() 
    End Try 

它是在我的DataGridView中引發錯誤關於跨線程。

我曾嘗試這個移動到RunWorkerCompleted事件

DataGridView_Accounts.DataSource = bSource 
    For i As Integer = 0 To dataTable.Rows.Count - 1 
     dataTable.Rows(i)("Company ID") = dataTable.Rows(i)("Company ID") 
     dataTable.Rows(i)("Lastname") = dataTable.Rows(i)("Lastname") 
     dataTable.Rows(i)("Firstname") = dataTable.Rows(i)("Firstname") 
     dataTable.Rows(i)("Middlename") = dataTable.Rows(i)("Middlename") 
     dataTable.Rows(i)("Contact No.") = dataTable.Rows(i)("Contact No.") 
     dataTable.Rows(i)("Area") = dataTable.Rows(i)("Area") 
    Next 

大約有跨線程沒有更多的錯誤,但是在我的DataGridView我無法查看結果。即使我的數據庫已滿,它也是空的。由於

+0

該循環沒有意義......它所做的只是將行和字段值分配給自己。 – MrGadget

+0

後臺工作正在檢索數據,這是通過調用'Fill'完成的。擺脫那無用的循環。 UI更新是數據綁定,您應該在'RunWorkerCompleted'事件處理程序中執行此操作。 – jmcilhinney

+0

在SQL中有兩個無效的列別名:'column02 AS'公司ID''和'column04 AS'聯繫號'''除非MySql允許它們中有空格。 – MrGadget

沙发
0
1

看看這個讓你更接近的工作...

Imports MySql.Data 

Public Class Form1 

    Private Const ConnectionString As String = "" 

    ' This probably comes from the form but OP did not share that with us. 
    Private selectedAccount As String = "" 

    Private dataTable As New DataTable 

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     Task.Run(Sub() DoWork()) 
    End Sub 

    Private Sub DoWork() 
     Dim query As String = "SELECT column02 AS 'CompanyID', column05 AS Lastname, 
           column06 AS Firstname, column07 AS Middlename, 
           column04 AS 'ContactNo', column13 AS 'Area' 
           FROM table01 WHERE column10 = @selectedAccount AND column18 = 'Yes'" 

     Using MySqlConnection As New MySqlClient.MySqlConnection(ConnectionString) 
      Dim MySqlCommand As New MySqlClient.MySqlCommand(query, MySqlConnection) 

      ' Use Parameters to avoid vulnerability to SQL Injection 
      MySqlCommand.Parameters.Add("@selectedAccount", MySqlClient.MySqlDbType.String) 
      MySqlCommand.Parameters("@selectedAccount").Value = selectedAccount 

      Using MySqlDataAdapter As New MySqlClient.MySqlDataAdapter(MySqlCommand) 
       MySqlDataAdapter.Fill(dataTable) 
      End Using 
     End Using 

     RefreshGrid() 
    End Sub 

    Sub RefreshGrid() 
     If Me.InvokeRequired Then 
      ' Shift this call to the UI thread 
      Me.Invoke(Sub() RefreshGrid()) 
     Else 
      bSource.DataSource = dataTable 
      DataGridView_Accounts.DataSource = bSource 
      DataGridView_Accounts.Refresh() 
     End If 
    End Sub 

End Class 

老實說,「漂亮的名字」應在DGV,而不是SQL設置,但那是另一個話題,我沒有追逐這個解決方案。

0
votes
answers
7 views
+10

如何在asp.net webforms中啓動一個新的長時間線程?

0

我們有一個排名列表方法,需要5個小時才能完成。如何在asp.net webforms中啓動一個新的長時間線程?

我們將列表緩存在內存緩存中,但當緩存過期時,它會阻止所有請求。

所以我想同時緩存memcache中的列表和緩存時間,並設置一個很長的過期時間。

每次會從內存緩存列表中,該方案還檢查緩存時間,如果超過1小時,該程序將啓動一個新的線程,其再生等級表,程序將立即返回舊名單,

所以,程序中沒有任何阻止。

問題是,它是否正確開始在asp.net中的新腳步?如果新線程在aspx線程響應結束時被終止?

如何解決傳播緩存鎖?我們使用3個iis服務器

沙发
0
0

您可以在Global.asax中使用App_Start來獲取與請求無關的線程,但您應該意識到它仍然存在限制(例如,工作池可能會在一段時間)。

看看這裏瞭解更多信息:http://www.informit.com/articles/article.aspx?p=25722&seqNum=8

板凳
0
0

您必須首先提高應用程序的超時時間,您可以在配置文件中設置。 爲了不要斷開

<system.web> 
    <sessionState timeout="60"></sessionState> 
</system.web> 

鏈接:http://msdn.microsoft.com/fr-fr/library/system.web.sessionstate.httpsessionstate.timeout(v=vs.80).aspx

緩存,您可以使用不同的持久高速緩存系統:如果你使用Cache可以爲時間設定時間跨度會議,高速緩存或應用

堅持

鏈接:http://msdn.microsoft.com/fr-fr/library/system.web.caching.cache.aspx

地板
0
0

我認爲你應該使用http處理程序。
http://msdn.microsoft.com/en-us/library/ms228090%28v=vs.100%29.aspx
它作爲一個線程,您可以訪問任何東西session,cache等。
爲此,您將不得不使用IRequiresSessionState
http://msdn.microsoft.com/en-us/library/system.web.sessionstate.irequiressessionstate.aspx

你可以從任何地方調用它。
code behind或從jquery

0
votes
answers
7 views
+10

爲靜態方法獲取內存超出範圍例外

0

我得到Memory Out of Range例外,用於比較兩個jpeg文件的靜態方法。爲靜態方法獲取內存超出範圍例外

我能不過來識別我的代碼部分使用分析器佔用了大部分的內存,我不能釋放內存,即使我嘗試GC.Collect的()

public static bool IsDuplicate(string newFile, string pathDestination) 
{ 
    string[] destinationFiles = Directory.GetFiles(pathDestination); // 1100 jpeg files. 
    foreach (var file in destinationFiles) 
    { 
     if (CompareImageFiles(newFile, file)) 
      return true; 
    } 
    return false; 
} 

//1100 jpeg files (pathFile2) being compared with one jpeg file (pathFile1) 
public static bool CompareImageFiles(string pathFile1, string pathFile2) 
{ 
    // Memory consumption around 1 GB by ms 
    MemoryStream ms = new MemoryStream(); 
    // Memory consumption around 2.7 GB by img1 
    System.Drawing.Image img1 = System.Drawing.Image.FromFile(pathFile1); 

    // Memory consumption around 3 GB by img2 
    System.Drawing.Image img2 = System.Drawing.Image.FromFile(pathFile2); 
    if (!(img1.Height == img2.Height && img1.Width == img2.Width)) 
    { 
     return false; // Dimensions mismatch 
    } 
    else 
    { 
     img1.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
     string image1 = Convert.ToBase64String(ms.ToArray()); 
     img2.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); 
     string image2 = Convert.ToBase64String(ms.ToArray()); 
     if (image1.Equals(image2)) 
     { 
      // This didn't work 
      //ms = null; img1 = null; img2 = null; image1 = null; image2 = null; 
      return true; 
     } 
     else 
     { 
      // This didn't work 
      //ms = null; img1 = null; img2 = null; image1 = null; image2 = null; 
      return false; 
     } 
    } 
} 

小背景:是的,我明白這不是比較圖像文件的最佳方法(我第一次嘗試處理圖像文件)。我已經開始了此任務的新優化版本(進行中)。

但是,由於該解決方案自過去幾個月開始運作並且最近開始破產。所以,在我將這種方法歸檔之前,至少我想解決這個問題,這給了我一個很好的學習。

+5

如何第一比較文件 - 大小來處理處理?然後你散列這些文件並比較散列 - 如果它們不同,它們在內部也是不同的。不需要這個圖像的東西?那麼你應該做的更快,更多的資源友好。 –

+1

您的應用程序正在泄漏。任何實現Dispose方法的東西都必須在你完成後處理掉。 – Plutonix

+0

試試這個:https://stackoverflow.com/a/16318177/7505395 –

沙发
0
4

你應該,或者通過將它們放置在一個using陳述或通過手動調用Dispose()當你與他們進行處置您的Image實例和存儲流:

public static bool CompareImageFiles(string pathFile1, string pathFile2) 
{ 
    using (var ms = new MemoryStream()) 
    using (var img1 = System.Drawing.Image.FromFile(pathFile1)) 
    using (var img2 = System.Drawing.Image.FromFile(pathFile2)) 
    { 
     // Rest of your code... 
    } 
} 
+2

要補充,通常使用「使用」是首選的方式,因爲它也處理適當的處置,以防發生異常情況。只有在不能使用「使用」或Dispose方法/終結器時才應直接調用Dispose。 – ckuri

0
votes
answers
6 views
+10

一次啓動多個任務,然後在完成其中一個任務時啓動另一個任務

1

我有一個運行在從其他站點下載圖像文件的asp.net web api中運行的代碼。一次啓動多個任務,然後在完成其中一個任務時啓動另一個任務

這是我用來下載圖像的代碼。

 foreach (string file in images) 
     { 
      using (WebClient client = new WebClient()) 
      { 
       await client.DownloadFileTaskAsync(file, path + Path.GetFileName(file));      
      } 
     } 

我真正需要做的是立即開始10次下載。 (例如使用Task.Run ...或者其他方式),然後在最初開始的10逐個完成時逐個開始休息。

For EX。

啓動10個任務

等到了10個任務完成一個

1次時完成,啓動另一個任務

當其他1次完成,啓動另一個任務等等

直到下載列表中的所有圖像。

所以我的代碼運行時最多有10周併發下載量(或小於10,如果沒有更多的圖像被下載。)

我使用.NET 4.5.2

你們可以指出我在正確的方向來實現這一目標嗎?

+0

這不是說這回答你的問題,而是看看Hangfire http://hangfire.io/ - 看起來像是你的需求的完美契合 – 2014-10-10 11:19:04

+0

你可能需要啓動10個任務,然後使用Task .WaitAny(taskList)' – artm 2014-10-10 11:22:42

沙发
0
2

您可以使用SemaphoreSlim扼殺異步工作方式:

private readonly SemaphoreSlim _mutex = new SemaphoreSlim(10); 

... 

var downloads = images.Select(file => DownloadAsync(file)); 
await Task.WhenAll(downloads); 

... 

private async Task DownloadAsync(string file) 
{ 
    await _mutex.WaitAsync(); 
    try 
    { 
    using (WebClient client = new WebClient()) 
    { 
     await client.DownloadFileTaskAsync(file, path + Path.GetFileName(file));      
    } 
    } 
    finally 
    { 
    _mutex.Release(); 
    } 
} 

注:

  • 您可能需要調整System.Net.ServicePointManager.DefaultConnectionLimit
  • 您應該避免在ASP.NET上使用Task.Run。請參閱我的recent MSDN article on async ASP.NET瞭解更多詳情。
+0

很好的答案。謝謝 :) – Amila 2014-10-11 17:50:20

板凳
0
0

我有點想大聲這裏,不知道這是否會工作,別人會希望它改善:

private void startFirst10Tasks() 
{ 
    List<Task> tasks = new List<Task>(); 
    //tasks.Add first 10 tasks 
    taskHandler(tasks); 
} 

private void taskHandler(List<Task> tasks) 
{ 
    Task.Factory.ContinueWhenAny(tasks, winner => 
     { 
      getNewTasks(tasks.Except(new List<Task>{winner})); 
     }); 
} 

private void getNewTasks(List<Task> tasks) 
{ 
    tasks.Add(
     Task.Factory.StartNew(() => 
     { 
      //Next DownloadFileTask 
     }) 
    ); 

    taskHandler(tasks); 
} 
0
votes
answers
6 views
+10

替代在mvc .net核心應用程序中啓動線程?

0

我們製造工廠內部有多種儀器,它們以不同的速度將數據插入數據庫內的多個表格。替代在mvc .net核心應用程序中啓動線程?

每條生產線上都有一臺計算機連接到網頁上,操作員輸入分配的作業編號並顯示一些相關信息。

我們的目標是根據工廠設備插入的數據顯示指示。狀態與原材料可用性,倉庫存儲可用性,溫度範圍等有關。

我最初的想法是通過產生一條線來修改當前的MVC應用程序,每條生產線每隔10秒掃描插入的信息,並可能推送數據槽通過signarlR來建議操作員。我讀到MVC應用程序中的起始線程是一種不好的做法,可能會影響IIS管理線程的方式。

我想知道如果不使用單獨的線程,如何在MVC中承載獨立於快速回歸的進程?

謝謝你的時間!

沙发
0
0

是的,開始輪詢線程可能不是這裏最好的方法。我可能會建議的另一種解決方案是將您所謂的工具(即當前正在插入數據)修改爲SignalR客戶端,並在每次插入一些數據時向服務器廣播一條消息。然後SignalR服務器可以簡單地將此消息廣播到與之連接的JavaScript SignalR客戶端。通過這種方式,您可以在生產數據的儀器和可以實時顯示此數據的瀏覽器客戶端之間實現(通過SignalR服務器)的直接通信。

+0

對不起,我會添加更多信息。這些設備使用梯形圖編程的PLC,這是工業和實時的。它確實支持數據庫上的CRUD操作。 –

+0

此外,我想保留服務器上的業務規則計算,因爲我們正在越來越多地將數據集成到其他系統(如ERP)。 –

+0

然後,您可能想要抽象一些您的設備將調用的API背後的CRUD操作,以便您可以輕鬆地通知SignalR服務器關於傳入更新。相信我,你完全不希望在ASP.NET應用程序中產生輪詢線程。這就像想要在腳下開槍一樣。 –

0
votes
answers
6 views
+10

後臺線程

0

我在Global.asax中 運行的Application_Start()後臺線程使用像Windows服務 但applicaton_end火,當所有會議在我的網站結束後臺線程

我有一個短信商務與web服務的工作,我希望有代理在我的服務器,像Windows服務 檢查傳入消息

我增加會話超時10個小時,但是當我關閉瀏覽器應用程序結束時觸發和 我的線程停止工作

我不能改變服務器屬性

我可以禁用application_end線程繼續工作嗎?

我向你道歉,因爲英語寫作

沙发
0
0

iis的自動關閉網站的應用程序時,沒有會話在網站 爲禁止開放這一點,你可以在IIS中更改空閒時間閱讀或在Global.asax中(application_end)功能的網站鏈接,開始一個新的會話

板凳
0
1

你應該做的是作爲服務運行或批處理程序做一個單獨的程序。儘管ASP.NET在頁面加載之間持久存在靜態變量等,但您不應該使用它在後臺運行。不保證事情會繼續運行。

如果在服務器上發生某些事情時(如收到的消息(如在facebook上),某人響應請求或引發其他事件),您需要實施輪詢在用戶看到的使用AJAX的網頁上的javascript系統(查看它......這樣一個真棒概念)定期與服務器交談以查看是否發生了任何事情。這就是Facebook聊天如何與大多數網絡郵件系統一起檢查新郵件的方式。服務器不會與瀏覽器通話...如果發生任何事情,瀏覽器會詢問服務器。

下面是一個使用AJAX聊天程序的例子:http://www.dynamicajax.com/fr/JSON_AJAX_Web_Chat-.html

這不正是你在做什麼,但它表明了試圖檢查一番頁面加載後,使該概念用戶的瀏覽器響應。

地板
0
0

不能使用.NET版本的quartz-scheduler庫(http://quartz-scheduler.org/)來定義和基於配置(cron expresion)觸發作業。

0
votes
answers
6 views
+10

基於HTTP動詞的路由動作?

0

我想基於在Startup.cs通過下面的代碼HTTP動詞得到ASP.NET的Core 2 MVC路由的行動:基於HTTP動詞的路由動作?

 app.UseMvc(routes => 
     { 
      routes.MapRoute(
       name: "post", 
       template: "api/{controller}/{id?}", 
       defaults: new { action = "Post" }, 
       constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint("POST") }) 
      ); 
      routes.MapRoute(
       name: "delete", 
       template: "api/{controller}/{id?}", 
       defaults: new { action = "Delete" }, 
       constraints: new RouteValueDictionary(new { httpMethod = new HttpMethodRouteConstraint("DELETE") }) 
      ); 
      routes.MapRoute(
       name: "default", 
       template: "api/{controller}/{action=Get}/{id?}"); 
     }); 

也就是說,

  • 如果客戶端請撥打GET http://example.com/api/foo,在我的FooController : Controller類上運行Get()方法。
  • 如果他們呼叫GET http://example.com/api/foo/123,那麼在我的FooController : Controller類上運行Get(int id)方法。
  • 如果他們呼叫POST http://example.com/api/foo,那麼在我的FooController<T> : Controller類上運行Post([FromBody] T postedItem)方法。
  • 如果他們呼叫POST http://example.com/api/foo/123,那麼在我的FooController<T> : Controller類上運行Post(int id, [FromBody] T postedItem)方法。
  • 如果他們叫DELETE http://example.com/api/foo/123,在運行Delete(int id)方法對我FooController : Controller

當我運行該項目,它似乎並沒有運行任何我的控制器。我有一些Razor頁面可以響應,但所有基於控制器的路由只返回404路由。即使默認路由似乎不起作用。

我一直在使用https://github.com/ardalis/AspNetCoreRouteDebugger試圖幫助我縮小問題的範圍,但我仍然沒有發現問題。它將控制器上的方法顯示爲可用操作,但未列出通過MapRoute添加的任何名稱,模板或約束。我很高興知道任何其他有用的工具。

FWIW,我試圖使用相同的動詞限制如下: https://github.com/aspnet/Routing/blob/2.0.1/src/Microsoft.AspNetCore.Routing/RequestDelegateRouteBuilderExtensions.cs#L252-L268

+0

什麼是'FooController的'?您無法直接路由到通用控制器,因爲Core在構建期間無法提供該類型。您可以將其用作基本控制器,但您必須路由到「實現」該類型的內容,即「BarController:FooControlller '。 –

+0

@ChrisPratt:這是一些僞代碼,旨在傳達各種控制器將期望不同的POST主體架構並接收各自類型的[FromBody]參數。我把把具體類型作爲方法參數一定沒問題 - 只是每個類都有相同的方法名稱,但期望不同的具體類型。附:我喜歡你的電影(也許你真的是克里斯普拉特?):https://www.youtube.com/embed/kj802AGE9Bg?start=22&end=25 – steamer25

沙发
0
0

所以我不記得到底是什麼問題原來是,但元的解決方案是,你可以調試路由通過將日誌級別從「信息」增加到「調試」來解決問題。例如,通過appsettings.json:

{ 
    "Logging": { 
    "Debug": { 
     "LogLevel": { 
     "Default": "Debug" 
     } 
    }, 
    "Console": { 
     "LogLevel": { 
     "Default": "Debug" 
     } 
    } 
    } 
} 

...然後你會得到這樣的例如,Visual Studio中的應用程序輸出窗格中的消息:

[40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Routing.RouteConstraintMatcher[1] 
     Route value '(null)' with key 'httpMethod' did not match the constraint 'Microsoft.AspNetCore.Routing.Constraints.HttpMethodRouteConstraint'. 
Microsoft.AspNetCore.Routing.RouteConstraintMatcher:Debug: Route value '(null)' with key 'httpMethod' did not match the constraint 'Microsoft.AspNetCore.Routing.Constraints.HttpMethodRouteConstraint'. 
[40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Routing.RouteBase[1] 
     Request successfully matched the route with name 'get' and template 'api/{controller}/{id?}'. 
Microsoft.AspNetCore.Routing.RouteBase:Debug: Request successfully matched the route with name 'get' and template 'api/{controller}/{id?}'. 
[40m[37mdbug[39m[22m[49m: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1] 
     Executing action Contoso.Media.ServiceHost.Controllers.MediaController.Get (Contoso.Media.ServiceHost) 
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Debug: Executing action Contoso.Media.ServiceHost.Controllers.MediaController.Get (Contoso.Media.ServiceHost) 
0
votes
answers
6 views
+10

使用Ajax將數組從視圖傳遞到控制器,但是在操作時,數組顯示爲空

1

我正在將數組從視圖傳遞到使用Ajax的控制器,但操作時數組顯示爲空。使用Ajax將數組從視圖傳遞到控制器,但是在操作時,數組顯示爲空

這是我的代碼:

查看

$("#btn").click(function() { 
      debugger 
      arry = []; 
       $.ajax({ 
       type: "Post", 
       url: "/Main/CheckBoxes", 
       data: { Values: arr["48","47","46"] }, 
       success: function() { 
        alert("array: " + arry.join(', ')); 
       }, 
       error: function() { 
        alert("error"); 
       } 
      }) 


     }); 

行動

public ActionResult array(string[] Values) 
     { 
      for (int id = 0; id < Values.Length; id++) 
      { 
       string newID = Values[id]; 
      } 

     return View(); 
    } 
+0

'數據:{值: 「48」, 「47」, 「46」]},'和'加上傳統:真實;' –

+1

和動作方法的名字是'array',你在呼喚來自客戶端腳本的其他內容!!! – Shyju

沙发
0
1
jQuery.ajaxSettings.traditional = true; 

$("#btn").click(function() { 
      debugger 
      arry = []; 
       $.ajax({ 
       type: "Post", 
       url: "/Main/CheckBoxes", 
       data: { Values:["48","47","46"]},//just edit this line 
       success: function() { 
        alert("array: " + arry.join(', ')); 
       }, 
       error: function() { 
        alert("error"); 
       } 
      }) 


     }); 
+0

動態創建該數組使用jquery和數組創建成功,如果我這樣發送數組({值:arry.join(',')})arry有值,但是當我發送像這樣的數組({值:arry} )其顯示空陣列? –

+0

data:{Values:arry} –

板凳
0
1

您的代碼對於你是如何發送數據的一些問題!當你執行這個表達式時你期望什麼arr["48","47","46"] ?????這將給你undefined,這就是你想要發送!

有兩種方法可以修復您的代碼。您可以在請求正文中發送數組。爲此,您需要從數組中創建一個JSON字符串,並將其作爲data屬性發送,同時將請求內容類型標頭值顯式指定爲「application/json」。您可以使用JSON.stringify方法來獲取js數組的JSON字符串。

此外,請確保您正在調用正確的操作方法。在您的問題中,您分享了array操作方法代碼,但在您的客戶端腳本中,您嘗試調用不同的操作方法(「複選框」)!

這應該工作。

var arry = ["48", "47", "46"]; 
var url = "@Url.Action("array", "Main")"; // Update your real url here 
// If your script is inside the razor view, you can us Url.Action (c#) method 

$.ajax({ 
    type: "Post", 
    url: url , 
    data: JSON.stringify(arry), 
    contentType: "application/json", 
    success: function(r) { 
     alert("Success"); 
     console.log(r); 
    }, 
    error: function() { 
     alert("error"); 
    } 
}); 

另一種選擇是發送javascript對象與屬性Values(其具有數組作爲它的值)作爲$.ajax呼叫的數據屬性值。現在請求內容類型頭將爲application/x-www-form-urlencoded;,並且該數組將在請求中作爲FormData發送。

var arry = ["48", "47", "46"]; 

$.ajax({ 
    type: "Post", 
    url: "/Main/array", 
    data: { Values: arry }, 
    success: function(r) { 
     console.log(r); 
    }, 
    error: function() { 
     alert("error"); 
    } 
}); 
+0

動態創建該數組並使用jquery,並且數組已成功創建,如果我發送數組,如下所示({Values:arry.join(',')})arry具有值,但是當我發送數組像這樣({Values:arry})其顯示空數組? –

+0

我剛剛用MVC5應用程序,jquery 3.2.1測試瞭解決方案的第二部分,它對我很有幫助。你有沒有嘗試第一個解決方案? – Shyju

0
votes
answers
6 views
+10

爲什麼HttpClient PutAsync在成功更新後返回內部服務器錯誤

0

我有一個HttpPut API方法,用於編輯它傳遞併成功保存到數據庫中的對象。這工作正常,但是從我的MVC應用程序,我用來調用我的API Put方法的httpClient.PutAsync返回內部服務器錯誤,即使API Put方法沒有。爲什麼HttpClient PutAsync在成功更新後返回內部服務器錯誤

我不知道什麼錯誤,API方法工作正常,但不知何故MVC的HttpClient仍然得到一個內部服務器錯誤。

API put方法

[HttpPut] 
    public IActionResult Put([FromBody] School school) 
    { 
     try 
     { 
      var schoolExists = _schoolRepository.SchoolExists(school.Id); 

      if (!schoolExists) return NotFound(); 

      if (!ModelState.IsValid) return BadRequest(); 

      var schoolData = Mapper.Map<School, Data.School>(school); 

      var updatedClass = _schoolRepository.UpdateSchool(schoolData); 

      if (!updatedClass) return Json(GetHttpResponseMessage(HttpStatusCode.InternalServerError)); 

      var route = CreatedAtRoute("GetSchool", school); 

      return route; 
     } 
     catch (Exception e) 
     { 
      return LogException(e); 
     } 
    } 

上述方法,工作正常,我的改變被保存到數據庫中,CreatedAtRouteResult對象從API方法返回。上述

MVC的HttpClient

public async Task<T> PutObject(string path, T content, string accessToken) 
    { 
     using (var httpClient = new HttpClient()) 
     { 
      try 
      { 
       SetBaseUri(httpClient, accessToken); 

       var serialisezContent = CreateHttpContent(content); 

       var httpResponse = await httpClient.PutAsync(path, serialisezContent); 

       if (httpResponse.StatusCode == HttpStatusCode.InternalServerError) throw new Exception("Problem accessing the api"); 

       return JsonConvert.DeserializeObject<T>(GetResult(httpResponse)); 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 

    } 

的方法,其中是問題是,這條線var httpResponse = await httpClient.PutAsync(path, serialisezContent);仍返回內部服務器錯誤。我的POST有相同的實現,並且工作得很好。

SETBASEURI()

private void SetBaseUri(HttpClient httpClient, string accessToken) 
    { 
     httpClient.BaseAddress = new Uri(BaseUri); 
     httpClient.DefaultRequestHeaders.Authorization = 
      _authenticationHeaderValueCreator.CreateAuthenticationHeaderValue("bearer", accessToken); 
    } 

CreateHttpContent()

public ByteArrayContent CreateHttpContent<TParam>(TParam httpObject) 
    { 
     var content = JsonConvert.SerializeObject(httpObject); 
     var buffer = System.Text.Encoding.UTF8.GetBytes(content); 
     var byteContent = new ByteArrayContent(buffer); 

     byteContent.Headers.ContentType = new MediaTypeHeaderValue("application/json"); 

     return byteContent; 
    } 
沙发
0
0

我敢打賭,你的API Put方法確實有消息No route matches the supplied values返回HTTP 500錯誤。你可以在Fiddler中檢查它。

而問題是具有以下線:

var route = CreatedAtRoute("GetSchool", school);

CreatedAtRoute方法以一個路徑名作爲第一個參數。我懷疑你有一條名爲GetSchool的路線。這是相同控制器中的一個操作名稱。而且CreatedAtRoute不會爲未知路由拋出異常,它只會返回500個錯誤碼。

要解決此問題,使用CreatedAtAction方法,而不是CreatedAtRoute

var route = CreatedAtAction("GetSchool", school); 
板凳
0
0

我認爲這個問題是從API的結果是失敗的序列化。嘗試在單元測試中手動序列化結果並查看失敗的位置。