großes Problem mit Webservice Anbindung :o(

Hi!

Ich habe heute eigentlich nur Zeit damit verbracht, mich in Webservices einzuarbeiten. Ich habe mir hierzu dann das "Visual Web Developer 2005 Express Edition" herunter geladen und einen neuen ASP.NET-Webdienst erstellt.

Hier wurden mir in mein Projekt drei Dateien hinein gelegt:
- Service.vb
- Service.asmx
- web.config

In meinem schlauen CRM-Buch steht nun, dass ich einen Webverweis auf den CRMService erstellen soll. Das habe ich auch gemacht auf den http://meinserver/mscrmservices/2006/crmservice.asmx

Dann habe ich nach Anleitung eine InsertLead.asmx Datei angelegt und mit dem langen Code, dessen Sprache ich nicht mächtig bin, da ich nicht weiß, was es ist.

[schnipp]
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Web.Services;
using WebSiteConnector.CrmSdk;


namespace WebSiteConnector {
    ///<summary>
    ///Summary desciption
    ///</summary>
    public class InsertLead : System.Web.Services.WebService {
        public InsertLead() {
            //CODEGEN: This call is required by the ASP.NET Web Services Designer
            InitializeComponent();
        }
    }
   
    #region Component Designer generated code
    //Required by the Web Services Designer
    private IContainer components = null;
   
    ///<summary>
    ///Required method for Designer support - do not modify
    ///the contents of this method with the code editor.
    ///</summary>
   
    private void InitializeComponent() {
   
    }
       
    ///<summary>
    ///Clean up any resources being used.
    ///</summary>
    protected override void Dispose(bool disposing) {
        if(disposing && components != null) {
            components.Dispose();
        }
        base.Dispose(disposing);
    }
   
    #endregion
   
    [WebMethod]
    public string InsertLeadFromWebForm(string Token, string FirstName, string LastName, string Company, string EmailAddress, string Comments) {
        string ret = string.Empty;
        //Ensure that only valid users use the service by checking for the proper Key value.
        if(Token == "some long string") {
            //Validate we have required fields
            if(LastName == string.Empty) {
                ret = "Last name must be entered.<br>";
            } else if(Company == string.Empty) {
                ret += "Company must be entered.<br>";
            }

[schnapp]

Und den Rest verstehe ich überhaupt nicht. Wenn ich die Service.asmx anschaue, die eigentlich nach meinem Verständnis den Webdienst darstellt, enthält diese nur
<%@ WebService Language="vb" CodeBehind="~/App_Code/Service.vb" Class="Service" %>
Die Service.vb brauche ich aber gar nicht, weil ich ja laut Buch die InsertLead.asmx anlegen und füllen sollte.

Mir ist überhaupt nicht klar:
- wie ich auf den Webservice zugreife --> Beispielsweise habe ich ein popeliges HTML-Formular und mache einen Submit. Der Webservice soll die Daten verarbeiten und ins CRM ablegen.

- wofür ich welche Datei brauche und was ich über den Haufen werfen kann

- welche Programmiersprache ich verwende

- wo ich welche Dateien ablegen muss

- ob ich zusätzlich noch irgendetwas einrichten / konfigurieren muss

Es beginnt so langsam die "ich hab keine Lust mehr"-Phase und bevor ich darin versinke bitte ich lieber um eine verständliche Erklärung. *g*

Rosenrot

EDIT: durch den Webverweis habe ich CRMService.disco CRMService.discomap und CRMService.wsdl hinzugewonnen. Nach Anschauen der WSDL-Datei habe ich gesehen, dass darin sich die Elemente der Anfrage befinden, auf die ich eigentlich zugreifen möchte.


AW: großes Problem mit Webservice Anbindung :o(

So wie ich deine Anforderung verstehe, musst du nicht zwingend einen Webservice dafür erzeugen. Es genügt "normale" aspx-Seite, die deine Leads erzeugt.


Also in der Web Dev. Express Edition "neue ASP.NET Webseite" oder "neues ASP.NET Projekt" erstellen und auch dort den Verweis auf http://meinserver/mscrmservices/2006/crmservice.asmx anlegen. Ist für meinen Geschmack weniger komplex als der Webservice...



AW: großes Problem mit Webservice Anbindung :o(

ok, um auch die Fragen zu beantworten:


- wie ich auf den Webservice zugreife --> Beispielsweise habe ich ein popeliges HTML-Formular und mache einen Submit. Der Webservice soll die Daten verarbeiten und ins CRM ablegen.


bei der "normalen" aspx Seite: diese in deinem HTML-Formular als action hinterlegen; form action="http://......deineseite.aspx" method=post


in der aspx Seite fragst du mit Request.Form['irgendeinfeld'] die eingegebenen Werte aus dem HTML-Formular ab


welche Datei brauche und was ich über den Haufen werfen kann


nur die aspx-Datei...

- welche Programmiersprache ich verwende


das bleibt dir überlassen, C# oder VB.NET oder ... alles möglich

- wo ich welche Dateien ablegen muss


nur die aspx-Datei optimalerweise auf dem CRM Server...ich habe eigentlich keine Schmerzen damit, diese eigenen Seiten direkt mit in das CRM Web zu legen (da deine VWD Express aber wohl nur .NET 2.0 beherrscht, müsstest du ein virtuelles Verzeichnis innerhalb des CRM Webs anlegen und mit NET 2.0 laufen lassen, gib Bescheid, wenn kurze Anleitung benötigt...)



AW: großes Problem mit Webservice Anbindung :o(

also ich habe nochmal ein bisschen rumprobiert und auch auf dem Server für SOAP 1.1 und 1.2 ein OK erhalten. Auch konnte ich die Funktionen von vb heraus abrufen und erhielt die Stringausgabe.
Ich würde es jetzt so lösen: ich erstelle ein Formular in ASP.NET, darin method=post. Beim POST widerrum würde ich den CRMService von Microsoft aufrufen wollen (weiß ja nicht, ob das so funktioniert *G*) und die Daten zum "wegschreiben" übergeben. So rein theoretisch halt. Ich setz mich da einfach mal ran :o)
Danke & schöne Grüße
Rosenrot


was ich nun habe

Ich habe ein Formular erstellt mit den Feldern:
- Kunde (Textinput)
- Vorname (Textinput)
- Nachname (Textinput)
- Kategorie (Dropdown)
- Betreff (Textinput)
- Notizen (Textarea)

Nun habe ich (zugegebenermaßen) das Script aus dem MS CRM Buch abgeschrieben und ein wenig abgeändert. Denn: das CRM Buch spricht in der Aktion des JavaScript (wird beim Submitklick ausgelöst) deren WebSiteConnector an, den ich dann doch erstmal beiseite legen möchte.
Ich würde gerne, weil ich auch schon gesehen habe, dass der CRMService die Felder in der WSDL-Datei enthält, direkt den Service ansprechen, dass der mir das wegspeichert.

Zum Einen: wie funktioniert sowas?
Zum anderen: ist das so wie in PHP, dass ich die Inputfelder gleichnamig gestalten muss wie die Felder, die ich im Original anspreche?

Hier noch die Soße, die ich bereits gemacht habe:
[schnipp]
function submitForm() {
   
    //URL where the Web service is installed --> umgeändert in MSCRM-Service
    var url = "/mscrmservices/2006/crmservice.asmx";
   
    //Validierung vorerst mal weglassen...
   
    try {
       
        var oXmlHTTP = new ActiveXObject("Msxml2.XMLHTTP");
       
        oXmlHTTP.Open("POST", url, false);
       
        oXmlHTTP.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
       
        //+++ HIER MUSS DRINGEND NOCH ANGEPASST WERDEN +++
        var qs = "token=some long string";
        qs += "&firstname=" + document.all.crm.firstname.value;
        qs += "&lastname=" + document.all.crm.lastname.value;
        qs += "&company=" + document.all.crm.company.value;
        qs += "&emailaddress=" + document.all.crm.emailaddress.value;
        qs += "&comments=" + document.all.crm.comments.value;
       
        oXmlHTTP.Send(qs);
       
        var result = "";
       
        if((oXmlHTTP.responseXML.xml) != null && (oXmlHTTP.responseXML.xml.toString().length > 0))
        {
            result = oXmlHTTP.responseXML.selectSingleNode("string").text;
        }
       
        if(result == "Success") {
            msg = "<br><br>Thank you for your request. A representative will contact you shortly.";
               
            document.all.formtable.style.display = "none";
        } else {
            msg = "There was an error with you submission. Please try again. <br> Error: " + result;
        }
    } catch(e) {
        msg = "There was an error with you submission. Please try again. Error: <br>" + e.message;   
    }
   
    document.all.div_results.innerHTML = msg;
}
[schnapp]

Ich verstehe zum Beispiel den Abschnitt, bei dem die Variable qs zusammengesetzt wird, nicht. Da wird ein String aneinander gekettet. Hilft doch nicht wirklich weiter, wenn ich einzelne Werte wegspeichern will..oder?

'Nen lieben Gruß,
Rosenrot


AW: was ich nun habe

Hi!
Auch wenn's in diesem Thread ziemlich Mau aussieht, poste ich mal weiter. Ich habe nun folgendes gemacht:

eine ASPX-Seite erstellt und eine ASPX.VB-Seite dazu.

In der ASPX-Seite steht:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb"
    Inherits="_Default" %>
   
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Spielwiese</title>
<script language="javascript" type="text/javascript">
<!--


// -->
</script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <asp:Label id="Label1" runat="server"></asp:Label>   
    </div>
   
    </form>
</body>
</html>

So... und in der aspx.vb-Datei steht:

Imports System
Imports CrmSdk

'Namespace Microsoft.Crm.Sdk.HowTo

Partial Class _Default
    Inherits System.Web.UI.Page
    '/ This sample shows how to route an incident from a user's Work In
    '/ Progress (WIP) queue into a public queue. Similar code could be used
    '/ to route an incident from a public queue into a WIP queue.
    '/ </summary>

    <STAThread()> _
    Public Shared Sub Main(ByVal args() As String)
        Run()
    End Sub

    Public Shared Function Run() As Boolean
        Dim success As Boolean = False

        Try
            ' Set up the Microsoft CRM service.
            Dim service As CrmService = New CrmService
            service.Credentials = _
               System.Net.CredentialCache.DefaultCredentials
            'service.Url =
            '   "http://localhost/mscrmservices/2006/CrmService.asmx"

            ' Get the ID of the system user.
            Dim userRequest As WhoAmIRequest = New WhoAmIRequest
            Dim user As WhoAmIResponse = _
               CType(service.Execute(userRequest), WhoAmIResponse)

            '#region Setup Data Required for Me Sample
            ' Create a new customer account.
            Dim myAccount As account = New account
            myAccount.name = "A Bike Store"
            Dim accountID As Guid = service.Create(myAccount)

            ' Create a new subject.
            Dim mySubject As subject = New subject
            mySubject.title = "Bicycles"
            Dim subjectID As Guid = service.Create(mySubject)

            ' Create a new incident.
            Dim incident As incident = New incident

            Dim myCustomer As Customer = New Customer
            myCustomer.Value = accountID
            myCustomer.type = EntityName.account.ToString()
            incident.customerid = myCustomer

            MsgBox("im try drin")

            Dim subjectLookup As Lookup = New Lookup
            subjectLookup.Value = subjectID
            subjectLookup.type = EntityName.subject.ToString()
            incident.subjectid = subjectLookup

            incident.title = "Broken Chain"
            Dim incidentID As Guid = service.Create(incident)

            ' Create a new public Bicycle Cases queue.
            Dim publicQueue As queue = New queue

            Dim businessLookup As Lookup = New Lookup
            businessLookup.Value = user.BusinessUnitId
            businessLookup.type = EntityName.businessunit.ToString()
            publicQueue.businessunitid = businessLookup

            Dim userLookup As Lookup = New Lookup
            userLookup.Value = user.UserId
            userLookup.type = EntityName.systemuser.ToString()
            publicQueue.primaryuserid = userLookup

            Dim plist As Picklist = New Picklist
            plist.name = "Public"
            plist.Value = 1
            publicQueue.queuetypecode = plist

            publicQueue.name = "Bicycle Cases"
            Dim publicQueueID As Guid = service.Create(publicQueue)
            '#endregion

            ' Find the WIP queue for the user who currently owns the
            ' incident. The queue type code for a WIP queue is 3.
            Dim query As QueryByAttribute = New QueryByAttribute
            query.ColumnSet = New AllColumns
            query.EntityName = EntityName.queue.ToString()
            query.Attributes = New String() {"primaryuserid", _
                                             "queuetypecode"}
            query.Values = New String() {user.UserId.ToString, "3"}

            Dim results As BusinessEntityCollection = _
               service.RetrieveMultiple(query)

            Dim wipQueue As queue = CType(results.BusinessEntities(0), _
                                          queue)
            ' Create a Target object which refers to the incident.
            Dim target As TargetQueuedIncident = New TargetQueuedIncident
            ' SDK:target.EntityId =
            '    new Guid("A0F2D8FE-6468-DA11-B748-000D9DD8CDAC");
            target.EntityId = incidentID

            ' Route the incident from the WIP queue to the public queue.
            Dim route As RouteRequest = New RouteRequest
            route.Target = target
            route.RouteType = RouteType.Queue
            ' SDK:route.EndpointId =
            '    new Guid("A0F2D8FE-6468-DA11-C748-000D9DD8CDAC");
            route.EndpointId = publicQueueID
            ' SDK:route.SourceQueueId =
            '    new Guid("A0F2D8FE-6468-DA11-D748-000D9DD8CDAC");
            route.SourceQueueId = wipQueue.queueid.Value

            Dim routed As RouteResponse = Nothing
            routed = CType(service.Execute(route), RouteResponse)

            '#region check success

            If Not routed Is Nothing Then
                success = True
            End If

            '#endregion

            '#region Remove Data Required for Me Sample

            service.Delete(EntityName.incident.ToString(), incidentID)
            service.Delete(EntityName.queue.ToString(), publicQueueID)
            service.Delete(EntityName.subject.ToString(), subjectID)
            service.Delete(EntityName.account.ToString(), accountID)

            '#endregion
        Catch ex As System.Web.Services.Protocols.SoapException
            Console.WriteLine(String.Format("{0}. {1}", ex.Message, _
                                            ex.Detail.InnerText))
        End Try

        Return success
    End Function
End Class
'End Namespace

Rufe ich im Explorer localhost/WebSite1 auf, erhalte ich die Fehlermeldung: Der Typ '_Default' konnte nicht geladen werden. Und ich lese diese Fehlermeldung nun schon seit Stunden, hab schon das ein oder andere ausgeklammert, eingefügt, ganz herausgelöscht. Jetzt habe ich Codetechnisch in meiner Entwicklungsumgebung keinen Fehler mehr, aber beim Laden im Browser zickt der immer noch herum.
Vielleicht hat ja hierzu einer eine Idee.

Gruß,
Rosenrot


AW: was ich nun habe

Ist das Web/das virt. Verzeichnis mit ASP.NET 2.0 konfiguriert? Oder versucht der IIS, deinen Webservice mit NET1.1 auszuführen?


Wenn NET2.0 soweit richtig läuft, wähle mal im VWD Express im Menü Erstellen -> Website neu erstellen.


Dann try again



AW: was ich nun habe

öhh, wo kann ich das konfigurieren? Ich habe heute mehrfach neue Webseiten über das Menü erstellt, immer mit demselben Ergebnis. Sogar mit C# und immer der gleiche Fehler :o(

EDIT: in der web.config steht das hier: <configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">


AW: was ich nun habe....

unter http://localhost:1569/incidentguide1/Default.aspx funktioniert es nun. Per Zufall bin ich aber auch nur da drauf gekommen. Normalerweise habe ich die ganze Zeit versucht auf localhost/incidentguide1/Default.aspx zu zugreifen, aber immer wieder der alt bekannte Fehler.

Ich kann also jetzt mein Formular ausfüllen. Schön :o) wäre ja kein toller Post, wenn ich nicht schon wieder eine Folgefrage hätte *fg*

Derzeit steht in meinem Formular:
<form id="form1" action="Default.aspx.vb" method="post" runat="server">

Kann ich das überhaupt in der action so schreiben? Vorgeschlagen hat mir das Programm nämlich die Default.aspx, nur steht da ja keine Anweisung drin, nur das kleine Formular. Wenn ich nun auf "submit" klicke, lädt der brav mein Formular neu. Ich erhalte keine Fehlermeldung oder sonst irgendwas. Eine neue Anfrage ist aber auch nicht erstellt worden.

So ganz ohne Fehlermeldung komm ich nicht weiter. Außerdem habe ich mich gerade an diesen Zustand gewöhnt ;o)

Debug-Könige gesucht!

Rosenrot


AW: was ich nun habe....

Dass nur default.aspx als Form-action vorgeschlagen wird, ist schon korrekt. In der Datei steht ja ganz oben eine Anweisung wie z.B.


<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>


Dadurch weiß die default.aspx, dass sie gefälligst in der default.aspx.vb nach den zugehörigen Anweisungen zu suchen hat.


Die *.vb und auch *.cs-Dateien werden vom Internet Information Server gar nicht erst ausgeführt.



AW: was ich nun habe....

gut, ich habe das hier
[blablabla]
Partial Class _Default
    Inherits System.Web.UI.Page

    '/ <summary>
    '/ This sample shows how to route an incident from a user's Work In
    '/ Progress (WIP) queue into a public queue. Similar code could be used
    '/ to route an incident from a public queue into a WIP queue.
    '/ </summary>

    <STAThread()> _
    Public Shared Sub Main(ByVal args() As String)
        Run()
    End Sub

    Public Shared Function Run() As Boolean
        Dim success As Boolean = False
[blablabla]

Werden jetzt alle Prozeduren / Funktionen, die in Default.aspx.vb drin stehen automatisch ausgeführt, oder nur die, die in main() stehen oder nur die, die explizit aufgerufen werden?
Ich möchte ja, dass die Anweisungen erst ausgeführt werden, wenn das Formular submittet wurde.