Asp.net mvc 4 为什么当我试图归档Bing搜索API的结果时,这个控制器会将插入加倍?
我正试图通过以下方式存档我的搜索结果Asp.net mvc 4 为什么当我试图归档Bing搜索API的结果时,这个控制器会将插入加倍?,asp.net-mvc-4,bing-api,asynccontroller,Asp.net Mvc 4,Bing Api,Asynccontroller,我正试图通过以下方式存档我的搜索结果 在异步控制器中使用Bing API 使用实体框架将它们插入数据库 使用Bing API并使用实体框架将它们插入数据库。无论出于什么原因,它都会返回50个结果,但随后会将100个结果输入数据库 我的控制器代码: public class DHWebServicesController : AsyncController { // // GET: /WebService/ private DHContex
public class DHWebServicesController : AsyncController
{
//
// GET: /WebService/
private DHContext context = new DHContext();
[HttpPost]
public void RunReportSetAsync(int id)
{
int iTotalCount = 1;
AsyncManager.OutstandingOperations.Increment(iTotalCount);
if (!context.DHSearchResults.Any(xx => xx.CityMarketComboRunID == id))
{
string strBingSearchUri = @ConfigurationManager.AppSettings["BingSearchURI"];
string strBingAccountKey = @ConfigurationManager.AppSettings["BingAccountKey"];
string strBingUserAccountKey = @ConfigurationManager.AppSettings["BingUserAccountKey"];
CityMarketComboRun cityMarketComboRun = context.CityMarketComboRuns.Include(xx => xx.CityMarketCombo).Include(xx => xx.CityMarketCombo.City).First(xx => xx.CityMarketComboRunID == id);
var bingContainer = new Bing.BingSearchContainer(new Uri(strBingSearchUri));
bingContainer.Credentials = new NetworkCredential(strBingUserAccountKey, strBingAccountKey);
// now we can build the query
Keyword keyword = context.Keywords.First();
var bingWebQuery = bingContainer.Web(keyword.Name, "en-US", "Moderate", cityMarketComboRun.CityMarketCombo.City.Latitude, cityMarketComboRun.CityMarketCombo.City.Longitude, null, null, null);
var bingWebResults = bingWebQuery.Execute();
context.Configuration.AutoDetectChangesEnabled = false;
int i = 1;
DHSearchResult dhSearchResult = new DHSearchResult();
List<DHSearchResult> lst = new List<DHSearchResult>();
var webResults = bingWebResults.ToList();
foreach (var result in webResults)
{
dhSearchResult = new DHSearchResult();
dhSearchResult.BingID = result.ID;
dhSearchResult.CityMarketComboRunID = id;
dhSearchResult.Description = result.Description;
dhSearchResult.DisplayUrl = result.DisplayUrl;
dhSearchResult.KeywordID = keyword.KeywordID;
dhSearchResult.Created = DateTime.Now;
dhSearchResult.Modified = DateTime.Now;
dhSearchResult.Title = result.Title;
dhSearchResult.Url = result.Url;
dhSearchResult.Ordinal = i;
lst.Add(dhSearchResult);
i++;
}
foreach (DHSearchResult c in lst)
{
context.DHSearchResults.Add(c);
context.SaveChanges();
}
AsyncManager.Parameters["message"] = "The total number of results was "+lst.Count+". And there are " + context.DHSearchResults.Count().ToString();
}
else
{
AsyncManager.Parameters["message"] = "You have already run this report";
}
AsyncManager.OutstandingOperations.Decrement(iTotalCount);
}
public string RunReportSetCompleted(string message)
{
string str = message;
return str;
}
}
公共类DHWebServicesController:AsyncController
{
//
//获取:/WebService/
private DHContext context=new DHContext();
[HttpPost]
public void RunReportSetAsync(int-id)
{
int iTotalCount=1;
AsyncManager.OutstandingOperations.Increment(iTotalCount);
如果(!context.DHSearchResults.Any(xx=>xx.CityMarketComboRunID==id))
{
字符串strBingSearchUri=@ConfigurationManager.AppSettings[“BingSearchURI”];
字符串strBingAccountKey=@ConfigurationManager.AppSettings[“BingAccountKey”];
字符串strBingUserAccountKey=@ConfigurationManager.AppSettings[“BingUserAccountKey”];
CityMarketComboRun CityMarketComboRun=context.CityMarketComboRuns.Include(xx=>xx.CityMarketCombo)。Include(xx=>xx.CityMarketCombo.City)。首先(xx=>xx.CityMarketComboRunID==id);
var bingContainer=new Bing.BingSearchContainer(newuri(strBingSearchUri));
bingContainer.Credentials=新的网络凭据(strBingUserAccountKey、strBingAccountKey);
//现在我们可以构建查询了
关键字=context.Keywords.First();
var bingWebQuery=bingContainer.Web(关键字.Name,“en-US”,“mediate”,cityMarketComboRun.CityMarketCombo.City.Latitude,cityMarketComboRun.CityMarketCombo.City.Longitude,null,null);
var bingWebResults=bingWebQuery.Execute();
context.Configuration.AutoDetectChangesEnabled=false;
int i=1;
DHSearchResult DHSearchResult=新的DHSearchResult();
List lst=新列表();
var webResults=bingWebResults.ToList();
foreach(webResults中的var结果)
{
dhSearchResult=新的dhSearchResult();
dhSearchResult.BingID=result.ID;
dhSearchResult.CityMarketComboRunID=id;
dhSearchResult.Description=结果.Description;
dhSearchResult.DisplayUrl=result.DisplayUrl;
dhSearchResult.KeywordID=关键字.KeywordID;
dhSearchResult.Created=DateTime.Now;
dhSearchResult.Modified=DateTime.Now;
dhSearchResult.Title=结果.Title;
dhSearchResult.Url=result.Url;
dhSearchResult.Ordinal=i;
lst.Add(dhSearchResult);
i++;
}
foreach(lst中的DHC搜索结果)
{
DHSearchResults.Add(c);
SaveChanges();
}
AsyncManager.Parameters[“message”]=“结果总数为”+lst.Count+”,其中有“+context.DHSearchResults.Count().ToString()”;
}
其他的
{
AsyncManager.Parameters[“message”]=“您已经运行此报告”;
}
AsyncManager.OutstandingOperations.Decreation(iTotalCount);
}
公共字符串RunReportSetCompleted(字符串消息)
{
字符串str=消息;
返回str;
}
}
下面是我在asp.NETMVC4页面中对它的称呼
@Ajax.ActionLink("Run Report", "GatherKeywordsFromBing", "DHWebServices",
new { id=item.CityMarketComboRunID},
new AjaxOptions { OnSuccess = "ShowNotifier();", UpdateTargetId = "TopNotifierMessage", HttpMethod = "POST", InsertionMode = InsertionMode.Replace, LoadingElementId = strCityMarketComboProgressID, LoadingElementDuration = 1000 },
new { @class = "ViewLink" })
<span class="ProgressIndicator" id="@strCityMarketComboProgressID"><img src="@Url.Content("~/Content/img/SmallBall.gif")" alt="loading" /></span>
@Ajax.ActionLink(“运行报告”、“GatherKeywordsFroming”、“DHWebServices”,
新建{id=item.CityMarketComboRunID},
新的AjaxOptions{OnSuccess=“ShowNotifier();”,UpdateTargetId=“TopNotifierMessage”,HttpMethod=“POST”,InsertionMode=InsertionMode.Replace,LoadingElementId=strCityMarketComboProgressID,LoadingElementDuration=1000},
新建{@class=“ViewLink”})
无论出于何种原因,所有人只需保存一次:
foreach (DHSearchResult c in lst)
{
context.DHSearchResults.Add(c);
}
context.SaveChanges();
此外,您的代码中没有异步,所以使用异步控制器没有意义。它不仅不会改善任何东西,而且可能会使事情变得更糟。当代码中没有异步内容时,为什么要使用异步控制器?这是完全连续的。在这种情况下,异步控制器没有意义。这只会让事情变得更糟。我计划在以后添加一些异步功能(即,它需要一些时间才能运行),并最终添加一个状态指示器。我尝试了你上面建议的方法,得到了同样的结果。这是一件令人担忧的事情。