Problema con HTTP handler in SharePoint 2010
-
16-10-2019 - |
Domanda
sto sviluppando una web part visiva per Sharepoint 2010. Questo webpart ha bisogno di ottenere alcuni dati tramite la tecnologia AJAX. Così sono andato per la soluzione HTTP handler + jQuery postato qui .
Ma sto diventando un problema quando si cerca di accedere al gestore. Ho la famosa pagina di errore NET:
Errore del server in '/' applicazione. Errore di runtime Descrizione: errore di applicazione si è verificato sul server. L'errore personalizzato corrente impostazioni per questa applicazione impediscono i dettagli dell'applicazione errore dalla visualizzazione a distanza (per motivi di sicurezza). Potrebbe, tuttavia, essere visualizzato dai browser in esecuzione sulla macchina server locale.
Dettagli: Per abilitare i dettagli di questo messaggio di errore specifico di essere visualizzabile su macchine remote, si prega di creare un tag all'interno di un file di configurazione "web.config" che si trova nella directory principale del applicazioni Web corrente. Questo tag deve poi avere il suo Attributo "mode" impostato su "Off".
Note: La pagina di errore corrente che state vedendo può essere sostituito da una pagina di errore personalizzata modificando l'attributo "defaultRedirect" del tag di configurazione dell'applicazione per puntare a un costume pagina di errore URL.
Così ho controllato Visualizzatore eventi del server per vedere i dettagli dell'errore. Questo è ciò che sta causando:
Event code: 3006
Event message: A parser error has occurred.
Event time: 8/4/2011 2:08:17 PM
Event time (UTC): 8/4/2011 6:08:17 PM
Event ID: 71c80726be98453ab77a7c1d474cbf7c
Event sequence: 5
Event occurrence: 2
Event detail code: 0
Process information:
Process ID: 6200
Process name: w3wp.exe
Account name: NT AUTHORITY\NETWORK SERVICE
Exception information:
Exception type: HttpParseException
Exception message: Could not create type 'MyNamespace.MyHandler'.
Request information:
Request URL: http://mysharepointurl/_layouts/MyNamespace/MyHandler.ashx
Request path: /_layouts/MyNamespace/MyHandler.ashx
User host address: xxx.xxx.xxx.xxx
User:
Is authenticated: False
Authentication Type:
Thread account name: NT AUTHORITY\NETWORK SERVICE
Thread information:
Thread ID: 11
Thread account name: NT AUTHORITY\NETWORK SERVICE
Is impersonating: True
Stack trace: at System.Web.UI.SimpleWebHandlerParser.GetType(String typeName)
at System.Web.UI.SimpleWebHandlerParser.GetTypeToCache(Assembly builtAssembly)
at System.Web.Compilation.SimpleHandlerBuildProvider.GetGeneratedType(CompilerResults results)
at System.Web.Compilation.BuildProvider.CreateBuildResult(CompilerResults results)
at System.Web.Compilation.BuildProvider.GetBuildResult(CompilerResults results)
at System.Web.Compilation.BuildManager.CompileWebFile(VirtualPath virtualPath)
at System.Web.Compilation.BuildManager.GetVPathBuildResultInternal(VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
at System.Web.Compilation.BuildManager.GetVPathBuildResultWithNoAssert(HttpContext context, VirtualPath virtualPath, Boolean noBuild, Boolean allowCrossApp, Boolean allowBuildInPrecompile)
at System.Web.UI.SimpleHandlerFactory.System.Web.IHttpHandlerFactory2.GetHandler(HttpContext context, String requestType, VirtualPath virtualPath, String physicalPath)
at System.Web.UI.SimpleHandlerFactory.GetHandler(HttpContext context, String requestType, String virtualPath, String path)
at System.Web.HttpApplication.MaterializeHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
Questa è MyHandler.ashx
<%@ WebHandler Language="C#" Class="MyNamespace.MyHandler" CodeBehind="MyHandler.cs" %>
Come si può vedere che mi manca la direttiva Assembly
. Ma io non so cosa mettere in esso. Dove posso trovare il KeyToke, nome, ecc?
Soluzione
Ho finito per openning Visual Studio Prompt dei comandi. Navigare alla cartella bin / uscita del mio web part e utilizzare il sn -T il comando sul mio DLL per ottenere il token!
Altri suggerimenti
In Visual Studio, imparare ad amare i token di SharePoint che sono disponibili. Per saperne di più su di loro qui: http://www.andrewconnell.com/blog/archive/2009/12/03/sharepoint-2010-dev-tidbit-use-the-tokens-in-visual.aspx
Ho fatto la stessa cosa oggi con un file Ashx separato e un file con estensione cs e funziona per me. Ho ottenuto lo stesso errore, ma poi notato che avevo fatto un nome di classe errore. Ecco il mio codice:
*****DemoHandler.cs********
using System;
using System.Web;
using Microsoft.SharePoint;
namespace CustomHTTPModule
{
public class DemoHandler : IHttpHandler
{
public bool IsReusable
{
get { return false; }
}
public void ProcessRequest(HttpContext context)
{
SPSite siteColl = SPContext.Current.Site;
SPWeb site = SPContext.Current.Web;
context.Response.ContentType = "text/plain";
context.Response.Write("Hello World from " +
site.Title +
" at " +
site.Url);
}
}
}
*********DemoHandler.ashx*******************
<%@ Assembly Name="Microsoft.SharePoint, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c" %>
<%@ Assembly Name="CustomHTTPModule, Version=1.0.0.0, Culture=neutral, PublicKeyToken=9eec5e2ad94ff809" %>
<%@ WebHandler Language="C#" Class="CustomHTTPModule.DemoHandler" CodeBehind="DemoHandler.cs" %>
Ho scelto un progetto di SharePoint vuoto in VS 2010 Visita il mio blog sotto per un'immagine della struttura del progetto
Fare clic su Distribuisci dovrebbe distribuire il dll CustomHTTPModule al GAC e l'Ashx alle _Layouts del Web app.If si naviga per " http: //webappname/sites/siteName/CustomHttpModule/DemoHandler.ashx " dovrebbe darvi il testo con il nome del sito Ho fatto riferimento a http://blogs.msdn.com/b/kaevans/archive/2010/08 /04/deploying-an-asp-net-httphandler-to-sharepoint-2010.aspx
veloce e sporco metodo? Eliminare l'assembly nella GAC ??e ottenere le proprietà su di essa. Una volta che hai quello che ti serve, è possibile fare clic destro disinstallarlo.
Update (15JAN13):
È inoltre possibile aggiungere uno strumento esterno per Visual Studio per aiutare con questo (Strumenti-> Strumenti esterni ...):
Title: Get Assembly Name
Command: powershell.exe
Arguments: -command "[System.Reflection.AssemblyName]::GetAssemblyName(\"$(TargetPath)\").FullName"
Use Output Window: checked
Quando il vostro eseguire il comando, la finestra di output mostrerà qualcosa di simile:
YourAssemblyName, Version = 1.0.0.0, Culture = neutral, PublicKeyToken = 9999d8e777777f66
Si può fare lo stesso tipo di cosa per lo strumento nome sicuro:
Title: Get Strong Name Token
Command: C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin\sn.exe
Arguments: -T $(TargetPath)
Use Output Window: checked
Con la finestra di output che mostra qualcosa di simile:
Microsoft (R) .NET Framework nome sicuro Utility Versione 3.5.30729.1 Copyright (c) Microsoft Corporation. Tutti i diritti riservati.
chiave pubblica token è 9999d8e777777f66