Postupy: Použití rozšíření objekty při spouštění transformace XSL v Visual C# .NET aplikací

Překlady článku Překlady článku
ID článku: 323370 - Produkty, které se vztahují k tomuto článku.
Rozbalit všechny záložky | Minimalizovat všechny záložky

Na této stránce

Souhrn

Bloky v řádku skriptu a součásti externího kódu lze implementovat vlastní rutiny vyvoláno během kurzu XSL (XSLT) transformace provádět výpočty a zpracovávat data. Společnost Microsoft doporučuje vyhnout použití bloky skriptu v řádku a místo toho použít externí kód součásti například vlastní rutiny implementovat při návrhu přenosný XSLT stylu listů. Externí kód součásti, které jsou používány XSLT jsou označovány jako objekty XSLT rozšíření.

Tento podrobný článek popisuje, jak nastavit a otestovat ukázkový aplikací ASP.NET na základě možných reálného světa scénář k ukazují, jak použít rozšíření objekty při spouštění XSLT v aplikaci Microsoft .NET aplikací.

Přehled ukázkový scénář

Tato část obsahuje popis scénář jednotek návrhu součásti ukázkové aplikace, který chcete vytvořit.

ABC Corp. je prodejce, který stocks a prodává poskytuje potravin vyrábějí vyberte několik dodavatelů. ABC Corp. používá ASP.NET intranet aplikace k záznamu a sledování informací, které se vztahuje k jeho skladových objednávek odběratele a dodavatele externí nákupní objednávky. Jeden omezení v aktuální skladové správy a nákupní objednávky modulech je nedostatek funkce dynamicky zobrazit aktuální úrovní zásob produktů na webu dodavatele před umístěním nákupní objednávky. Informace o technologii týmu na ABC Corp. informoval správy, že tato funkce může být implementováno máte systémy informace, které jsou používány dodavatelů provize dynamicky exchange požadovaná data. Správa týmu na ABC Corp. popsána tato funkce s každou dodavatelů a nalezen žádný dodavatelů měl zajištění tento požadavek zpracovat.

Jeden Dodavatelé XYZ Corp. vyjádřené úrok v pursuing tuto možnost, protože cítili takové funkce můžete také výhody jiných prodejců XYZ Corp. obchoduje. Systémy informace při XYZ Corp. také založený na .NET Framework pomocí technologie .NET. Týmy správy obou organizací se rozhodl nechat technologie pracovníky informace splňují a Debata architektura implementace této funkce. Podrobný výpis součásti modelu implementace konečné dohodli při je následující:
  • Prodejce (ABC Corp.) chce zobrazit aktuální úrovní zásob pro vybrané produkty na webu dodavatele (XYZ Corp.) formátovány a zobrazeny jako tabulku HTML.
  • Prodejce bude používat XML odeslat seznam ID produktu, pro které jsou vyžadovány od dodavatele aktuální úrovní zásob. XML bude vytvořena na základě produktů vybrané ze seznamu, který je zobrazen na ASP.NET webového formuláře. Generovaný XML bude mít stejný formát jako následující ukázka:
    <?xml version="1.0"?>
    <Products>
    	<Product id="1" name="Chai"/>
    	<Product id="2" name="Chang"/>	
    </Products>
    					
  • Dodavatele bude pomocí šablony stylů XSLT transformace XML přijaté a generovat HTML. Stylů XSLT použije objekt XSLT rozšíření dynamicky dotaz databáze Inventář dodavatele a data o úrovní zásob produktů zahrnout generované HTML.
Zbytek Tento článek popisuje, jak implementovat součásti, které jsou popsány v tomto modelu. Zachovat věci jednoduchý, bude vytvářet a testovat všechny součásti v jednom počítači.

Vytvořit objekt rozšíření ukázka

V této části vytvořit objekt rozšíření, které používá dodavatele (XYZ Corp.) ukázkový scénář dynamicky načíst informace o akciích produktu. Tento příklad používá pro účely obrázku data obsažená v tabulce výrobků v ukázkové databázi SQL Server Northwind. Objekt rozšíření implementuje jedinou metodu s názvem GetCurrentStockLevel. Metoda trvá ID produktu jako vstupní parametr a vrátí aktuální jednotek na skladě pro určený produkt na základě dat v tabulce Výrobky.

Tento objekt rozšíření a metodu vyvolat podle stylů XSLT, který slouží k transformaci XML je zaúčtována prodejce (ABC Corp.) načíst aktuální informace o akciích pro požadovaný produkty.

Vytvoření této součásti:
  1. V aplikaci Visual Studio .NET vytvářet nové Visual C# .NET třídy projektu knihovna s názvem InventoryExtensionObject.
  2. Odstranit výchozí modul Class1.cs je přidán do projektu.
  3. Přidat nový modul třídy s názvem Products.cs k projektu. Otevřete tento v editoru kódu a odstranit existující kód.
  4. Vložte následující kód v modulu třídy Products.cs implementovat produkty třídy:
    using System;
    using System.Data.SqlClient;
    
    namespace InventoryExtensionObject
    {
       public class Products
       {
          SqlConnection cn;
    
          public Products()
          {
             //You must modify the connection string in the following 
             //statement to point to your instance of the Northwind SQL Server
             //sample database. Make sure to use a user id that has the appropriate
            //permissions on the database.
             cn = new SqlConnection("server=.;database=northwind;user id=<username>;password=<strong password>;");
             cn.Open();
          }
    
          public int GetCurrentStockLevel(int ProductId)
          {
             //Construct query to retrieve UnitsInStock for the specified ProductId.
             SqlCommand cmd = new SqlCommand("Select UnitsInStock from Products where" + 
                                              " ProductID = " + ProductId, cn);
    
             //Execute query to retrieve UnitsInStock.
             int UnitsInStock = Convert.ToInt32(cmd.ExecuteScalar());
             
             return UnitsInStock;
          }
          
          public void Dispose()
          {
             cn.Close();
          }
       }
    }
    					
  5. Uložit změny Products.cs a vytvořit řešení.

Vytvořit šablonu stylů XSLT používajícím objekt rozšíření

V této části vytvoříte stylů XSLT pro dodavatele (XYZ Corp.) používá ukázkový scénář ke generování tabulku HTML zobrazí informace o aktuální úroveň zásob produktů požadavky prodejce (ABC Corp.). Tuto šablonu stylů se používá k transformaci XML je zaúčtována prodejce, který obsahuje seznam ID produktu, pro které je vyžadován aktuální informace o akciích. Používá objekt rozšíření, který jste vytvořili v předchozí části načíst data, která se vztahuje aktuální jednotek na skladě pro každý produkt.

Následující kód použít k vytvoření a uložení šablony stylů na pevný disk s názvem Products.xsl XSLT:
<?xml version='1.0'?>

<!-- Notice how a namespace URI and prefix are declared to reference the extension object --> 

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"  
                xmlns:InventoryExtensionObj="urn:InventoryExtensionObj">

<xsl:template match="Products">

	<HTML>	
	<BODY>
	<H3>XYZ Corp. Inventory stock level</H3><BR/>
	<TABLE BORDER="1">
		<TR>
			<TH>Product Id</TH>
			<TH>Product Name</TH>
			<TH>Units In Stock</TH>
		</TR>
		
	<xsl:for-each select="Product">
		<TR>
     			 <TD><xsl:value-of select="@id"/></TD>
			 <TD><xsl:value-of select="@name"/></TD>

			 <!-- 
			      Call extension object method to retrieve stock information.
			      Notice how the id attribute of the Product element is passed as the input
			      parameter. The actual instance of the Extension object will be supplied
			      by the code that executes the XSLT transformation.
  			 -->
   			 <TD><xsl:value-of select="InventoryExtensionObj:GetCurrentStockLevel(@id)"/></TD> 
		</TR>
	</xsl:for-each>

	</TABLE>
	</BODY>
	</HTML>	
	
</xsl:template> 

</xsl:stylesheet> 
				

Vytvořit ukázkové aplikace ASP.NET testování transformace XSLT

V této části vytvořte dva ukázkové aplikace ASP.NET. Jedna aplikace ASP.NET se používá k hostiteli ASP.NET Web formulář, který prodejce (ABC Corp.) používá ukázkový scénář k výběru aktualizovány informace o akciích produkty, pro které je požadováno. Webový formulář obsahuje kód v modulu třídy jeho kód pozadí generovat a zaúčtovat XML obsahující seznam vybrané produkty součást na webu dodavatele (XYZ Corp.) a zobrazit odpovědi vrácené HTML.

Aplikace ASP.NET se používá k implementaci webového formuláře systému dodavatele, na který XML prodejce generuje zaúčtována. Modul třídy kódem na pozadí webového formuláře obsahuje kód XML, která je zaúčtována a provede XSLT načíst transformace pomocí stylů XSLT, který jste vytvořili v předchozím kroku generovat a vrátíte požadované HTML. Obsahuje také kód vytvořit a potřeb instanci objektu rozšíření procesu transformace XSLT. Nejprve vytvořit aplikaci ASP.NET pro dodavatele.

Aplikaci ASP.NET dodavatele na provedení transformace XSLT

  1. V aplikaci Visual Studio .NET vytvářet nové Visual C# .NET webové aplikace Projekt s názvem SupplierSample.
  2. Odstranit webový formulář výchozí (WebForm1.aspx), která je přidána do projektu.
  3. Přidat šablony stylů XSLT (Products.xsl), který jste vytvořili v předchozím kroku do web projektu.
  4. Přidejte do projektu odkaz na objekt Extension DLL (InventoryExtensionObject.dll) vytvořené v tomto článku v části "Vytvořit ukázkové rozšíření objekt".
  5. Přidat nový webový formulář s názvem GetProductStockLevels.aspx k projektu a zobrazit jeho kód.
  6. Přidat následující konec oddílu pomocí direktivy:
    using System.Xml;
    using System.Xml.XPath;
    using System.Xml.Xsl;
    					
  7. Vložte následující kód v proceduře události Page_Load provedení transformace XSLT na XML je zaúčtována do webového formuláře. Prostudovat vložených komentářů v tématu Jak objekt rozšíření je vytvořena instance a použít proces transformace:
    try
    {
    	// Instantiate a new XPathDocument object and load the posted XML.
    	XPathDocument xmlDoc = new XPathDocument(Request.InputStream);
    	
    	// Instantiate a new XslTransform object and load the style sheet. 
    	XslTransform xslt = new XslTransform();
    	xslt.Load(Server.MapPath("products.xsl"));
    
    	// Instantiate an XsltArgumentList object.
    	// An XsltArgumentList object is used to supply extension object instances
    	// and values for XSLT paarmeters required for an XSLT. transformation	    
    	XsltArgumentList xsltArgList = new XsltArgumentList();
    
    	//Instantiate and Add an instance of the extension object to the XsltArgumentList.
    	//The AddExtensionObject method is used to add the Extension object instance to the
    	//XsltArgumentList object. The namespace URI specified as the first parameter 
    	//should match the namespace URI used to reference the Extension object in the
    	//XSLT style sheet.
    	InventoryExtensionObject.Products InventoryExtensionObj = new InventoryExtensionObject.Products();
    	xsltArgList.AddExtensionObject("urn:InventoryExtensionObj", InventoryExtensionObj);
    		
    	// Set the ContentType of the ASP.NET Response object to text/html.
    	Response.ContentType = "text/html";
    	
    	// Execute the transformation and generate the output to the Response object's
    	// output stream. Notice how the XsltArgumentList object to which the Extension
    	// object instance was added is supplied as a parameter when executing the
    	// Transform method of the XslTransform object. 
    	xslt.Transform(xmlDoc, xsltArgList, Response.OutputStream);
    
    	InventoryExtensionObj.Dispose();
    	InventoryExtensionObj = null;
    }
    // Exception handling code.
    catch(XsltCompileException xsltCompileExp)
    {
    	Response.Write(xsltCompileExp.Message);
    }
    catch(XsltException xsltExp) 
    {
    	Response.Write(xsltExp.Message);
    }
    catch(XPathException XPathExp)
    {
    	Response.Write(XPathExp.Message);
    }
    catch(XmlException XmlExp)
    {
    	Response.Write(XmlExp.Message);
    }
    					
  8. Uložit, zkompilujte a řešení webového projektu.

Aplikace ASP.NET prodejce úrovně burzovní Query dodavatele

  1. V aplikaci Visual Studio .NET vytvářet nové Visual C# .NET webové aplikace s názvem RetailerSample.
  2. Odstranit webový formulář výchozí (WebForm1.aspx), která je přidána do projektu.
  3. Přidat nový webový formulář s názvem GetSupplierStockLevels.aspx k projektu.
  4. Přepnutí do podokna HTML webového formuláře v okně návrháře a nahraďte existující kód následující generovat uživatelského rozhraní jednoduchý test: rozhraní uživatele zobrazí tři zaškrtávací políčka, které představují tři produkty, které jsou dodány podle dodavatele (a pro data, která existuje v ukázkové databázi Northwind) ukázkový scénář. Zaškrtávací políčka jsou pevný kódované v tomto vzorku pro jednoduchost. Jejich lze generovat dynamicky pomocí aplikace reálného světa vázání dat a řízení serveru ASP.NET CheckBoxList.
    <%@ Page Language="cs" AutoEventWireup="false" Codebehind="GetSupplierStockLevels.aspx.cs" Inherits="RetailerSample.GetSupplierStockLevels"%>
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
    <HTML>
    	<HEAD>
    		<title>TestPost</title>
    		<meta content="Microsoft Visual Studio.NET 7.0" name="GENERATOR">
    		<meta content="Visual C# 7.0" name="CODE_LANGUAGE">
    		<meta content="JavaScript" name="vs_defaultClientScript">
    		<meta content="http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
    	</HEAD>
    	<body MS_POSITIONING="GridLayout">
    		<form id="Form1" method="post" runat="server">
    			<asp:Label id="Label1" style="Z-INDEX: 101; LEFT: 39px;
                                       POSITION: absolute; TOP: 87px" runat="server" 
                                       Width="575px" Height="43px" Font-Names="Arial" 
                                       Font-Size="Medium">Get Stock Levels from XYZ Corp. for selected Products
        			</asp:Label>
    			<asp:CheckBox id="Product3" style="Z-INDEX: 104; LEFT: 359px; 
                                          POSITION: absolute; TOP: 154px" runat="server" Width="170px" 
                                          Height="30px" Font-Names="Arial" Font-Size="X-Small" Text="Aniseed syrup"> 
                            </asp:CheckBox>
    			<asp:CheckBox id="Product1" style="Z-INDEX: 102; LEFT: 39px; 
                                          POSITION: absolute; TOP: 155px" runat="server" Width="122px" 
    				      Height="35px" Font-Names="Arial" Font-Size="X-Small" Text="Chai">
    			</asp:CheckBox>
    			<asp:CheckBox id="Product2" style="Z-INDEX: 103; LEFT: 175px; 
    					POSITION: absolute; TOP: 155px" runat="server" Width="170px" 
    					Height="30px" Font-Names="Arial" Font-Size="X-Small" Text="Chang">
    			</asp:CheckBox>
    			<asp:Button id="Button1" style="Z-INDEX: 105; LEFT: 40px; 
    					POSITION: absolute; TOP: 237px" runat="server" Width="134px" 
    					Height="33px" Text="Go">
    			</asp:Button>
    			<asp:Label id="Label2" style="Z-INDEX: 106; LEFT: 36px; 
    					POSITION: absolute; TOP: 21px" runat="server" Width="579px" 
    					Height="37px" Font-Names="Arial" Font-Size="Medium" 
    					ForeColor="#0000C0">ABC Corp : Verify product stock levels with Partner company
    			</asp:Label></form>
    	</body>
    </HTML>
    					
  5. Otevřete modul třídy kódem na pozadí webového formuláře v editoru kódu Visual Studio .NET.
  6. Přidat následující konec oddílu pomocí direktivy:
    using System.Net;
    using System.IO;
    using System.Text;
    					
  7. Vložte následující kód v proceduře události Page_Load: Tento kód generuje XML výpis vybrané produkty, účtuje XML dodavatele aplikace a zobrazí vrácené HTML generovat tabulky uvádí aktuální úrovně akcií dodavatele. Třídy HttpWebRequest a HttpWebResponse v oboru názvů System.Net používá zaúčtovat XML web dodavatele a přístup k vrácené odpověď. Další informace o metodách tyto objekty používá tento kód naleznete v dokumentaci .NET Framework SDK o těchto tříd.
    //Check to see if a post back occured. If yes, then execute  code
    //to generate the XML and post it to the Supplier application.
    if(Page.IsPostBack)
    {
    	//Use a StringBuilder object to generate the XML string to post to the
    	//Supplier application. Strings in .NET are non-mutable. Using a String 
    	//variable to generate the following XML string would result in multiple
    	//String objects being created behind the scenes each time the variable is 
    	//modified. This can be prevented by using a StringBuilder object.
    	StringBuilder strXML = new System.Text.StringBuilder();
    
    	//Append a string for the root <Products> node. 
    	strXML.Append("<Products>");
    
    	//Generate a <Product> node for each selected product. To do this
    	//examine the Checked property of each product check box on the web form. 
    	if(Product1.Checked)
    		strXML.Append("<Product id='1' name='" + Product1.Text + "'/>");
    
    	if(Product2.Checked)
    		strXML.Append("<Product id='2' name='" + Product2.Text + "'/>");
    
    	if(Product3.Checked)
    		strXML.Append("<Product id='3' name='" + Product3.Text + "'/>");
    
    	//Append the closing </Products> node.
    	strXML.Append("</Products>");
    
    	//Instantiate a System.Net.HttpWebRequest object to post the generated XML to the 
    	//the GetProductStockLevels.aspx web form in the Supplier application. 
    	string PostURL = "http://localhost/SupplierSample/GetProductStockLevels.aspx";
    	HttpWebRequest HttpWReq = (HttpWebRequest) WebRequest.Create(PostURL);
    
    	//Intantiate a Stream object. The generated XML will be written to this object.
    	Stream HttpStream;
    
    	//Instantiate a Byte Array and use the GetBytes Static method of 
    	//of the System.Text.Encoding.UTF8 class to write the UTF-8 encoded
    	//byte representation of the generated XML string to the Byte Array.
    	Byte[] buf = System.Text.Encoding.UTF8.GetBytes(strXML.ToString());
    
    	//Set the Method property of the HttpWebRequest to POST to indicate
    	//that it will be used to execute an HTTP POST request. 
    	HttpWReq.Method = "POST";
    
    	//Write the contents of the Byte Array (the UTF-8 encoded byte representation
    	//of the XML string) to the HttpWebRequest's RequestStream. This is the data that 
    	//will be posted to the target URL. The GetRequestStream method is used to obtain 
    	//a reference to the HttpWebRequest's request stream. 
    	HttpStream = HttpWReq.GetRequestStream();
    	HttpStream.Write(buf, 0, buf.Length);
    	HttpStream.Close();
    
    	//Execute the GetResponse method of the HttpWebRequest object to execute the POST
    	//and use the generated Response to instantiate an HttpWebResponse object.
    	HttpWebResponse HttpWResp = (HttpWebResponse) HttpWReq.GetResponse();
    
    	//Use the GetResponseStream method of the HttpWebResponse object 
    	//to obtain a reference to its response stream.
    	Stream receiveStream = HttpWResp.GetResponseStream();
    
    	//Use the GetEncoding Static method of the System.Text.Encoding object to 
    	//instantiate a UTF-8 Encoding object. 
    	Encoding UTF8_Encoding = System.Text.Encoding.GetEncoding("utf-8");
    
    	// Pipe the response stream to a higher level stream reader with the required 
    	//encoding format. The StreamReader object will be used to access the contents
    	//of the ResponseStream.
    	StreamReader readStream = new StreamReader(receiveStream, UTF8_Encoding);
    
    	//Loop through and write out the contents of the ResponseStream (contains
    	//the HTML generated and returned by the Supplier application) 256 characters
    	//at a time to the ASP.NET Response object to display the HTML table listing 
    	//the Products and their current stock levels at the Supplier site. 
    	char[] read = new char[256];
    	int count = readStream.Read(read, 0, 256);
    	Console.WriteLine("HTML...\n\r");
    	while (count > 0)
    	{
    		//Write the 256 characters to a string.
    		String str = new String(read, 0, count);
    		Response.Write(str);
    		count = readStream.Read(read, 0, 256);
    	}
    	//Close the StreamReader.
    	readStream.Close();
    
    	//Close the HttpWebResponse object. 
    	HttpWResp.Close();
    	Response.End();
    }
    					
  8. Uložit, zkompilujte a řešení webového projektu.

Testování ukázkové aplikace ASP.NET

  1. Vyhledejte GetSupplierStockLevels.aspx webového formuláře v aplikaci prodejce použít následující adresu:
    http://localhost/RetailerSample/GetSupplierStockLevels.aspx
    					
  2. Pomocí zaškrtávacích políček na webového formuláře vyberte produkty, pro které chcete získat aktuální informace o akciích ze dodavatele aplikace.
  3. Klepněte na tlačítko Přejít ke generování XML, aby odrážel vybrané produkty, zaúčtovat XML GetProductStockLevels.aspx webový formulář dodavatele aplikace a zobrazení vrácené HTML. Zobrazí tabulku HTML, který uvádí vybrané produkty společně s jejich aktuální úrovní zásob na dodavatele webu.

Další informace

Implementace a přístupu k objektům rozšíření v ŠABLON stylů XSLT je doporučený návrh metodologie při musí vyvolat vlastní rutiny transformace XSL. XSLT objekty rozšíření vyžadují bloky skriptu vložené v stylů XSLT. Bloky vložený skript může být závislé na specifických pro dodavatele značky skriptu XSLT rozšíření a skriptovacího nebo programovacího jazyka překladače nebo kompilátory šablony stylů. Objekty XSLT rozšíření na druhou stranu není zadat nebo definovat jakékoli podrobnosti implementace, které souvisejí s technologie a komponenty, které slouží ke sbalení vlastní rutiny. Všechny požadované stylů XSLT je URI oboru názvů a předpon, které jsou přidruženy k objektu rozšíření. Definované předpona se používá k kvalifikovat volání metody objektu rozšíření v stylů XSLT jsou provedeny. Pomocí technologie volbu můžete implementovat skutečné součást objekt rozšíření. Jediným požadavkem je, že procesor XML nebo XSLT, který slouží k provedení transformace musí implementovat rozhraní, které umožňuje zadat instance objektů rozšíření jako vstupní argumenty procesu transformace XSLT.

Použití rozšíření objekty implementovat vlastní rutiny je také doporučené řešení pro problém popsaný v následujícím článku znalostní báze Microsoft Knowledge Base:
316775PRB: Nelze uvolnit sestavení, vytvoříte a načíst pomocí skriptu v XSLT

Odkazy

Další informace o provádění XSLT pomocí rozhraní .NET Framework získáte v článku číslo článku databáze Microsoft Knowledge Base:
313997INFORMACE: Průvodce pro provádění transformace XSLT v aplikací .NET Connected

Vlastnosti

ID článku: 323370 - Poslední aktualizace: 23. ledna 2004 - Revize: 4.0
Informace v tomto článku jsou určeny pro produkt:
  • Microsoft .NET Framework Class Libraries 1.0
  • Microsoft .NET Framework Class Libraries 1.1
Klíčová slova: 
kbmt kbhowtomaster KB323370 KbMtcs
Strojově přeložený článek
Důležité: Tento článek byl přeložen pomocí software společnosti Microsoft na strojový překlad, ne profesionálním překladatelem. Společnost Microsoft nabízí jak články přeložené překladatelem, tak články přeložené pomocí software na strojový překlad, takže všechny články ve Znalostní databázi (Knowledge Base) jsou dostupné v češtině. Překlad pomocí software na strojový překlad ale není bohužel vždy dokonalý. Obsahuje chyby ve skloňování slov, skladbě vět, nebo gramatice, podobně jako když cizinci dělají chyby při mluvení v češtině. Společnost Microsoft není právně zodpovědná za nepřesnosti, chyby nebo škody vzniklé chybami v překladu, nebo při použití nepřesně přeložených instrukcí v článku zákazníkem. Společnost Microsoft aktualizuje software na strojový překlad, aby byl počet chyb omezen na minimum.
Projděte si také anglickou verzi článku:323370
Právní omezení pro obsah znalostní báze týkající se produktů, jejichž podpora byla ukončena
Tento článek byl napsán o produktech, pro které společnost Microsoft již neposkytuje nadále podporu. Článek je tedy nabízen v takovém stavu, v jakém je, a nebude již nadále aktualizován.

Dejte nám zpětnou vazbu

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com