2016-08-14 4 views
0

У меня есть внешний вид контактов, который я хочу запустить из своего веб-приложения одним нажатием кнопки. Следующий код является мой класс длл и метод:Outlook Получить Контакты для веб-страницы - 0x800a139e - Ошибка выполнения JavaScript

public class AddressLookup 
{ 
    public Contact getContact() 
    { 
     RDOSession session = new RDOSession(); 
     session.Logon(Type.Missing, Type.Missing, Type.Missing, true, Type.Missing, Type.Missing); 
     bool loggedOn = session.LoggedOn; 

     try 
     { 
      RDOAddressBook rAddressBook = session.AddressBook; 
      RDORecipients rContacts = rAddressBook.ShowAddressBook(Title: "Outlook Lookup", OneAddress: true); 

      RDORecipient rContact = rContacts.GetFirst(); 
      RDOAddressEntry aeContact = rContact.AddressEntry; 

      return new Contact(aeContact.Name, aeContact.JobTitle, aeContact.CompanyName, aeContact.StreetAddress); 
     } 
     catch (Exception) 
     { 
      return new Contact("", "", "", ""); 

     }    
    } 

Следующий код, когда я бежал, когда кнопка нажата на веб-приложения:

protected void btnBillHeaderDetailsOutlook_Click(object sender, EventArgs e) 
{ 
    AddressLookup al = new AddressLookup();  

    var contact = al.getContact(); 
} 

При открытии VS в первый раз, весь процесс выполняется так, как ожидалось, и контактная переменная возвращает правильные данные. Эта проблема возникает, когда я пытаюсь снова нажать кнопку или снова запустить все веб-приложение, когда процесс истечет.

Unhandled exception at line 885, column 13 in http://localhost:27855/ScriptResource.axd?d= ... 0x800a139e - JavaScript runtime error: Sys.WebForms.PageRequestManagerTimeoutException: The server request timed out.

Я чувствую, что у меня нет чего-то основного, поскольку мне еще предстоит сделать это раньше. Большое спасибо за помощь.

Когда я запускаю его как приложение окон нагрузки, как и ожидалось (если это поможет)

+0

Outlook написан на C или C++, (afaik - единственное офисное приложение, которое полностью .Net/C#/Управляемый код - InfoPath), поэтому вы работаете с библиотекой unManaged с ресурсами, которые вам нужно явно Утилизировать или даже упростить перенос в операторе Using, поэтому попробуйте ... используя (сеанс RDOSession .... используя (RDOAddressBook rAddressBook ...) { –

+0

@JeremyThompson благодарит, кажется, что этот объект не реализует IDisposable, поскольку для объекта RDOSession не существует метода dispose(). –

ответ

0

Я знаю, что вы работаете в этом выключен локальный однако кажется, что Вы делаете автоматизацию офиса в стороне сервера контекста и не поддерживается в соответствии с статьей KB: Considerations for server-side Automation of Office. Это объясняет, почему он отлично работает с помощью приложения winform.

Вы не намеревались установить Office на сервере? Вместо этого вы должны использовать Exchange Servers WebService для реализации на стороне сервера, например, для получения контактов.

Edit:

"That fact has just dawned on me. This web app is for a intranet system and the dll will be registered on all the users PC's. To be able to use the users office installation with this dll would I need to run it through javascript somehow? Thanks"

Метод Javascript:

Лично я бы the orthodox method and use the web service как позволяет использовать любой веб-браузер, IE является единственным, который поддерживает ActiveX. В дополнение к тому, чтобы он работал в IE, вам, возможно, придется играть с разрешениями ActiveX (которые SysAdmin может переопределить или заблокировать). Если вы хотите сделать это с помощью Javascript, это должно помочь:

var Const_olFolderContacts = 10; 
var objApp = new ActiveXObject(“Outlook.Application”); 
var objNS = objApp.GetNamespace(“MAPI”); 
var colContacts = objNS.GetDefaultFolder(Const_olFolderContacts).Items 
for(var i=1; i<=colContacts.count;i++) 
{ 
var v = colContacts.item(i); 
alert(v[“FullName”]+” (“+v[“Email1Address”]+”)”); 
} 

«Если этот код не работает, выполните следующие действия: В Internet Explorer выберите Сервис | Свойства обозревателя | Безопасность -> от«Custom Уровень «перейти к„Инициализировать и сценарий ActiveX, не помеченных как безопасные для сценариев“и выберите» Запрашивать»- это должно работать»

Wordpress blog ref.

Stackoverflow ref.

Exchange Web Service Метод:

public class MicrosoftOutlook 
{ 
    private ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP2); 
    public MicrosoftOutlook() 
    { 
     try 
     { 
      service.Url = new Uri("https://webmail.YourCompanyName.com.au/EWS/Exchange.asmx"); 

      service.UseDefaultCredentials = true; 

     } catch (System.Runtime.InteropServices.COMException ex) 
     { 
     } 
    } 

    public void ListContacts() { 
    // Get the number of items in the contacts folder. To limit the size of the response, request only the TotalCount property. 
    ContactsFolder contactsfolder = ContactsFolder.Bind(service, WellKnownFolderName.Contacts, new PropertySet(BasePropertySet.IdOnly, FolderSchema.TotalCount)); 

    // Set the number of items to the number of items in the Contacts folder or 50, whichever is smaller. 
    int numItems = contactsfolder.TotalCount < 50 ? contactsfolder.TotalCount : 50; 

    // Instantiate the item view with the number of items to retrieve from the Contacts folder. 
    ItemView view = new ItemView(numItems); 

    // To keep the response smaller, request only the display name. 
    view.PropertySet = new PropertySet(BasePropertySet.IdOnly, ContactSchema.DisplayName); 

    // Request the items in the Contacts folder that have the properties that you selected. 
    FindItemsResults<Item> contactItems = service.FindItems(WellKnownFolderName.Contacts, view); 

    // Display the list of contacts. (Note that there can be a large number of contacts in the Contacts folder.) 
     foreach (Item item in contactItems) 
     { 
      if (item is Contact) 
      { 
       Contact contact = item as Contact; 
       Console.WriteLine(contact.DisplayName); 
      } 
     } 
    } 
} 

Ссылка мой код и это MSDN ref.

+0

спасибо за это. Этот факт только что наступил на меня. Это веб-приложение предназначено для системы интрасети, и DLL будет зарегистрирована на всех ПК пользователей. Чтобы иметь возможность использовать установку офиса пользователей с этой DLL, мне нужно каким-то образом запустить ее через javascript? благодаря –

Смежные вопросы