Danke nochmals für deine Antworten.
Ich habe den Code jetzt nochmals angepasst und übergebe als Parameter ein Objekt. Mit dem Objekt funktioniert es:
Klasse: IPersonenverwaltung
<OperationContract()>
<WebInvoke(Method:="POST", ResponseFormat:=WebMessageFormat.Json, RequestFormat:=WebMessageFormat.Json, UriTemplate:="setperson")>
Sub SetPerson(pPerson As Person)
Klasse: Personenverwaltung
Public Sub SetPerson(pPerson As Person) Implements IPersonenverwaltung.SetPerson
Code ...
End Sub
<DataContract()>
Public Class Person
Private _PersonID As Integer
<DataMember()>
Public Property PersonID() As Integer
Get
Return _PersonID
End Get
Set(ByVal value As Integer)
_PersonID = value
End Set
End Property
Private _Name As String
<DataMember()>
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Sub New(pPersonID As Integer, pName As String)
Me.Name = pName
Me.PersonID = Convert.ToInt32(pPersonID)
End Sub
End Class
$.ajaxSetup({ contentType: "application/json; charset=utf-8" });
$.post('http://localhost/WCFServiceTest/Personenverwaltung.svc/setperson', '{"PersonID":"20","Name":"Karl"}', null)
.success(function () {
alert("Success");
})
.error(function (xhr) {
alert(xhr.statusText + " " + xhr.responseText);
})
.complete(function () {
alert("Complete");
});
Was mache ich jetzt aber, wenn ich einen einfachen String per POST-Methode übergeben möchte? Irgendwie scheint es so, dass die Methode mit dem Parameter vom Typ String nicht klar kommt.
Gruß Beppo
Hast das nen Grund, dass Dein jQuery Post
null
enthält?
Ja, das soll einfach nur der besseren Lesbarkeit dienen, damit schnell erkannt werden kann, dass der Aufruf keine Callback Funktion implementiert.
Wenn ich mir die Google-Treffer dazu so anschau, so finde ich auch keine POST-Variante, die die Post-Daten in der URL erwartet....?
Genau aus diesem Grund würde ich gerne noch herausfinden, wo in meinem letzten Beispiel der Fehler begraben ist 😉
Was der Browser wirklich in dieser Situation an den Server schickt hast Du leider nicht gezeigt;
Nach der zusätzlichen Codezeile:
$.ajaxSetup({ contentType: "application/json; charset=utf-8" });
gibt Fiddler nun folgende Daten aus:
POST http://localhost/WCFServiceTest/Personenverwaltung.svc/setperson HTTP/1.1
x-requested-with: XMLHttpRequest
Accept-Language: de
Referer: http://localhost/WCFServiceTest/Test.htm
Accept: /
Content-Type: application/json; charset=utf-8
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET4.0C; .NET4.0E; .NET CLR 3.5.30729; .NET CLR 3.0.30729)
Host: localhost
Content-Length: 5
Connection: Keep-Alive
Pragma: no-cache
Die Daten sind:
id=12
Und das Bad Request zeigt in meinen Augen einen erfolgreichen Request - sehe jedenfalls keine 5xx Fehlernummer sondern nur ein 400, was jedenfalls auf einen Erfolg schließen lässt.
Bist du dir da sicher? Laut meinen Informationen stellen 4xx immer Fehler dar, die der Server generiert, wenn die Anfrage vom Client fehlerhaft war.
Das einzige, was sich zwischen Deinem und den erfolgreichen Implementierung unterscheidet, ist, dass diese sowas wie einen DataContract haben:
Das dürfte wohl nicht das Problem sein. Ich hab das Beispiel extra vereinfacht, eigentlich hat die Testanwendung einen DataContract für eine Klasse "Person". DataContracts werden aber nur benötigt, wenn es sich um benutzerdefinierte Objekte handelt. Im obigen Code verwende ich solche aber nicht.
Was mir gerade noch eingefallen ist: Der WCF Webservice ist am lokalen IIS 7.5 gehostet. Könnte das Problem vielleicht irgendwie am IIS-Server liegen?
Gruß Beppo
Danke für die Antworten.
Der Parameterempfang mit GET sollte nur zu Testzwecken dienen. In diesem Fall funktioniert aber die Lösung von winSharp93. Vielen Dank an dieser Stelle.
Wenn ich die Parameter aber nicht im UriTemplate definiere, funktioniert das Ganze aber immer noch nicht:
Klasse: IPersonenverwaltung
<OperationContract()>
<WebInvoke(Method:="POST", ResponseFormat:=WebMessageFormat.Json, RequestFormat:=WebMessageFormat.Json, UriTemplate:="setperson")>
Sub SetPerson(id As String)
Klasse: Personenverwaltung
Public Sub SetPerson(id As String) Implements IPersonenverwaltung.SetPerson
'Code ...
End Sub
$.post('http://localhost/WCFServiceTest/Personenverwaltung.svc/setperson', { "id": 12 }, null)
.success(function () {
alert("Success");
})
.error(function (xhr) {
alert(xhr.statusText + " " + xhr.responseText);
})
.complete(function () {
alert("Complete");
});
Wenn ich Daten mitgeben, erhalte ich als Fehler "Bad Request". Im Server-Log steht folgendes:> Fehlermeldung:
2012-03-13 16:27:55 ::1 POST /WCFServiceTest/Personenverwaltung.svc/setperson - 80 - ::1 Mozilla/4.0+(compatible;+MSIE+7.0;+Windows+NT+6.1;+WOW64;+Trident/5.0;+SLCC2;+.NET+CLR+2.0.50727;+.NET4.0C;+.NET4.0E;+.NET+CLR+3.5.30729;+.NET+CLR+3.0.30729) 400 0 0 308
Wenn ich keine Daten mitgebe wird die WCF-Funktion aufgerufen, jedoch ohne Parameterwert. Im Web finden sich etliche Beispiel, bei denen es anscheinend funktioniert. Hier noch als Ergänzung meine web.config:
<?xml version="1.0"?>
<configuration>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="WCFServiceTest.Personenverwaltung" behaviorConfiguration="RESTBehavior">
<endpoint address="" binding="webHttpBinding" name="BasicWCFServiceTestEndpoint" contract="WCFServiceTest.IPersonenverwaltung" behaviorConfiguration="webHttpEndpointBehaviorREST"/>
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="RESTBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webHttpEndpointBehaviorREST">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Jemand noch eine Idee an was es liegen könnte?
Gruß Beppo
Firebug gibt für den Request von setperson folgende Informationen aus:
Request-URL:
http://localhost/WCFServiceTest/Personenverwaltung.svc/setperson
Request-Methode:POST
Status-Code: HTTP/1.1 200 OK
Request-Headers
Accept:application/json, text/javascript, /; q=0.01
Accept-Encoding:gzip, deflate
Accept-Language:de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Cache-Control:no-cache
Connection:keep-alive
Content-Length:5
Content-Type:application/json; charset=utf-8
Host:localhost
Pragma:no-cache
Referer:http://localhost/WCFServiceTest/Test.htm
User-Agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
X-Requested-With:XMLHttpRequest
Response-Header
Content-Length:0
Date:Tue, 13 Mar 2012 15:02:57
GMTServer:Microsoft-IIS/7.5
X-Powered-By:ASP.NET
Gruß Beppo
Hey winSharp93,
vielen Dank für die schnelle Antwort. Leider brachte deine Lösung auch nicht den gewünschten Erfolg. Ich habe mittlerweile bereits alle möglichen Kombinationen von ', id und Wert ausprobiert, leider kommt bei der Methode immer Nothing an.
Gruß Beppo
Guten Tag,
irgendwie funktioniert die Datenübergabe vom Client (jQuery) an meinen WCF REST-Webservice nicht. Folgender kurzer Code ist gegeben:
Klasse: IPersonenverwaltung
<OperationContract()>
<WebInvoke(Method:="POST", ResponseFormat:=WebMessageFormat.Json, RequestFormat:=WebMessageFormat.Json, UriTemplate:="setperson?id={id}")>
Sub SetPerson(id As String)
Klasse: Personenverwaltung
Public Sub SetPerson(id As String) Implements IPersonenverwaltung.SetPerson
'Code ...
End Sub
$.ajax({
type: "POST",
async: false,
url: "http://localhost/WCFServiceTest/Personenverwaltung.svc/setperson",
data: '{id: 12}',
contentType: "application/json; charset=utf-8",
dataType: "json",
success: alert("Success"),
error: function (xhr) {
alert(xhr.responseText);
}
});
Egal wie ich den String im Attribut "data" hinbiege, in der Webservice-Methode im Paramter id kommt immer Nothing an. Was mache ich bei der Übergabe der Daten an den Webservice falsch?
Gruß Beppo
Nach langem Suchen hat sich herausgestellt, dass der Fehler wohl am Endpoint lag. Neuer Code:
<service name="WCFServiceTest.Geometry">
<endpoint address=""
binding="webHttpBinding"
name="BasicWCFServiceTestEndpoint"
contract="WCFServiceTest.IGeometry"
behaviorConfiguration="webHttpBindingREST" />
</service>
Gruß Beppo
Danke für den Tipp. Ich hatte als Vorlage diesen Artikel auf CodeProject: How to create a JSON WCF RESTful Service in 60 sec
Anstatt einer WCF-Dienstbibliothek habe ich es aber in einer WCF-Dienstanwendung, welche auf dem lokalen IIS-Server (7.5) gehostet ist, realisiert. Könnte das Problem vielleicht direkt am IIS-Server liegen?
Gruß Beppo
Guten Tag,
ich bin gerade dabei eine kleine WCF-Rest-Testapplikation zu erstellen und stoße hierbei bereits zu Beginn auf Probleme. Ich kann nämlich den REST-Webservice nicht ordnungsgemäß aufrufen. (Es handelt sich hierbei um VB.NET Code, aber ich denke das stellt kein Problem dar 😉 )
Imports System.ServiceModel.Web
<ServiceContract()>
Public Interface IGeometry
<OperationContract()>
<WebInvoke(Method:="GET", ResponseFormat:=WebMessageFormat.Json, UriTemplate:="person")>
Function GetPerson() As Person
End Interface
Public Class Geometry
Implements IGeometry
Public Function GetPerson() As Person Implements IGeometry.GetPerson
Return New Person(10, "Maximilian Huber")
End Function
End Class
<DataContract()>
Public Class Person
Private _PersonID As Integer
<DataMember()>
Public Property PersonID() As Integer
Get
Return _PersonID
End Get
Set(ByVal value As Integer)
_PersonID = value
End Set
End Property
Private _Name As String
<DataMember()>
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Sub New(pPersonID As Integer, pName As String)
Me.Name = pName
Me.PersonID = PersonID
End Sub
End Class
Und hier noch die web.config-Datei:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<services>
<service name="WCFServiceTest.Geometry">
<endpoint address="http://localhost/WCFServiceTest" binding="webHttpBinding"
bindingConfiguration="" name="BasicWCFServiceTestEndpoint" contract="WCFServiceTest.IGeometry" behaviorConfiguration="webHttpBindingREST" />
</service>
</services>
<behaviors>
<endpointBehaviors>
<behavior name="webHttpBindingREST">
<webHttp/>
</behavior>
</endpointBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
Wenn ich jetzt versuche die Methode GetPerson über http://localhost/WCFServiceTest/person aufzurufen, erhalte ich folgende Fehlermeldung:> Fehlermeldung:
HTTP-Fehler 404.0 - Not Found
Die gesuchte Ressource wurde entfernt oder umbenannt, oder sie steht vorübergehend nicht zur Verfügung.
Leider weiß ich nicht genau, wo hier der Fehler liegt. Kann mir bei meinem Problem von euch jemand weiterhelfen?
Gruß Beppo
Danke für die Information 👍
Da ich gerade am Testen bin, stellt sich für mich die - vielleicht etwas blöde Frage - aber wird bei der Umsetzung mit HTML5 und jQuery auf der Client-Seite und WCF mit SOAP oder REST auf der Server-Seite auch ASP.NET benötigt?
Ich erkenne gerade nicht, warum ASP.NET benötigt werden sollte. Jedoch kann ich in Visual Studio kein reines HTML-Webprojekt oder ähnliches anlegen, sondern nur Webprojekte mit ASP.NET.
Gruß Beppo
Vielen Dank, ihr habt mir schon mal sehr stark weitergeholfen. Ich werde das Ganze jetzt mal in einem Testszenario ausprobieren.
@Johnny: Welche Webservice-Technologie hast du unter WCF genutzt? Hast du das alles noch mit SOAP realisiert oder mit REST? Kommen eventuell noch andere Technologien in Frage?
Viele Grüße
Beppo
Guten Tag,
da ich mich zurzeit mit den Themen HTML5 und JavaScript/jQuery als Front-End beschäftige, wollte ich mal nachfragen, ob jemand bereits Erfahrungen bei der Entwicklung von HTML5 und JavaScript/jQuery in Visual Studio gemacht hat?
Ist Visual Studio dazu geeignet oder sollte lieber auf eine andere Entwicklungsumgebung zurückgegriffen werden? Im Back-End stellt eine .NET-Serveranwendung die benötigten Daten via WebService (aktuell WCF) dem Frond-End zur Verfügung.
Gruß Beppo
Hallo herbivore,
ebenfalls vielen Dank für die Antwort.
Es kommt also nur darauf an, ob es sich um reine Werte handelt (dann struct) oder um echte Objekte (dann class). Nichts anders spielt eine Rolle. Alle technischen Überlegungen fallen unter "premature optimization is the root of all evil". Davon sollte man sich auf keinen Fall leiten lassen.
Dieser "Leitsatz" ist eine sehr gute Orientierungshilfe für die Verwendung von struct oder class.
Man sollte ref nie als premature optimization für die Performance missbrauchen. Wenn das Original also nicht geändert werden muss, dann kein ref.
Dies ist ein guter Hinweis. Jedoch wird hierdurch der ByRef-Übergabe noch weniger Bedeutung attestiert. Somit denke ich, dass die Verwendung von ByRef wirklich nur noch in relativ wenig/sinnvollen Fällen im täglichen Programmieralltag Gebrauch findet.
Gruß Beppo
Hi zommi,
vielen Dank für die Antwort. Hatte leider nach dem Keyword "Struktur" gesucht und den verlinkten Artikel somit leider nicht gefunden.
Im Thread hat jnetrick noch etwas interessantes vor allem im Bezug auf die Verwendung von struct geschrieben:
Grundsätzlich denke ich dass man structs am besten für folgende Szenarien verwendet:
- kleine eigene Datentypen
- man benötigt keine Vererbung
- Referenztyp Verhalten ist nicht notwendig
- Es werden keine rießigen Datenmengen erwartet
Weiter wird auch noch erwähnt, dass bei der Übergabe einer struct an eine Methode i.d.R. (ByVal) der gesamte Inhalt der struct kopiert wird und es somit evtl. sogar zur Verschlechterung der Performance gegenüber Klassen kommen kann. Wenn man sich diesem Umstand als Entwickler jedoch bewusst ist, kann man die struct auch ByRef übergeben und somit den Nachteil wieder in einen Vorteil umwandeln.
Bei Zuweisungen wird jedoch immer die gesamte Struktur kopiert!
Bei großen "Objekten" schreibt herbivore folgendes:
aus technischer Sicht sind gerade bei großen "Objekten" Klassen vorzuziehen
Gruß Beppo
Hallo C#-Gemeinde,
ich habe vor kurzem festgestellt, dass Strukturen in .NET in meinem täglichen Programmieralltag leider nur ein Nischendasein führen.
Nachdem ich ein paar Informationen zusammengetragen habe, bin ich im groben auf folgende Vor- und Nachteile im Vergleich mit Klassen gekommen.
Vorteile:*(i.d.R.) geringerer Ressourcenverbrauch (Wertetyp --> Stack)
**Nachteile:***Keine Vererbung möglich (Nur mit Schnittstellen) *Kein eigener Standardkonstruktor möglich *Keine Initialisierung von Felder in der Struktur bei der Deklaration möglich *Fehlerquelle durch nicht initalisierte Variablen bei Nicht-Verwendung von new *Doppelte Initialisierungen möglich
Wann nehmt ihr am häufigsten Strukturen her und welche Vor- bzw. Nachteile gegen über Klassen sind neben den bereits genannten noch wichtig?
Gruß Beppo
Vielen Dank für die schnellen Antworten. Damit ist meine Frage beantwortet 😃
Gruß Beppo
Gut Tag,
ich beschäftige mich gerade mit dem Thema Garbage Collector, dazu ist eine Frage aufgetaucht.
Beispiel:
public String GetNewPersonName(String pVorname, String pNachname)
{
Person myPerson = new Person();
myPerson.Vorname = pVorname;
myPerson.Nachname = pNachname;
return myPerson.GetName();
}
In diesem Beispiel werden sämtliche Anweisungen der Methode und die benötigten Parameter auf dem Stack abgelegt. Dann wird ein Referenztyp myPerson erzeugt, dieser wird standardmäßig auf dem Heap abgelegt.
Wenn jetzt die Methode wieder verlassen wird, wird der Speicherbereich auf dem Stack wieder freigegeben, was passiert aber mit dem Referenztyp der auf dem Heap liegt?
Ist es nötig noch explizit
myPerson = null;
zu codieren, obwohl dies im Beispiel einen kleinen Umbau erfordern würde, oder wird die Referenz auf das Objekt mit Beenden der Methode automatisch gelöst?
Gruß Beppo
Hallo,
vielen Dank für die schnelle Antwort. Leider kann ich nicht genau sagen, ob im Projekt irgendwelche Ringabhängigkeiten bestehen. Gibt es eine Möglichkeit, dies relativ schnell herauszufinden?
Gruß Beppo
Guten Tag,
bei einem aktuellen Projekt besteht momentan das Problem, dass dieses nicht mehr "In-Einem-Zug" kompiliert werden kann. Das bedeutet, dass die erste Kompilierung des entwickelten Programms in Visual Studio 2008 fehlschlägt. Kompiliert man anschließend jedoch erneut, dann wird das Programm fehlerfrei kompiliert.
Diese Szenario konnte bereits auf mehrere Entwicklungssystemen rekonstruiert werden.
In dem VS-Projekt befinden sich ca. 40 eigenentwickelte Assemblies.
Hat jemand von euch eine Idee wie ich die Ursache des Problems ermitteln kann bzw. wie man vielleicht das Problem sogar lösen kann?
Gruß Beppo
Danke für den Hinweis.
Konnte aufgrund des Threads das Problem vorübergehend auch unterbinden, da ich einfach die Sicherheitsstufe der UAC unter Windows 7 auf ganz niedrig gestellt habe.
In wie weit ich damit komme, wird sich zeigen, aber temporär funktioniert es zumindest so.
Gruß Beppo
Guten Tag,
ich habe aktuell das selbe Problem wie der Threadautor. Ist bereits eine genaue Lösung für das Problem bekannt?
Ich erhalte ebenfalls unter Windows 7 beim Versuch Outlook zu starten, wenn es bereits geöffnet ist, den obig beschriebenen Fehler.
Gruß Beppo
Danke für die schnelle Antwort.
Hat super funktioniert 😉 Da war ich wohl ein bisschen Blind, als ich mich auf die Suche nach einem passenden Ereignis begeben habe 🤔
Gruß Beppo
Guten Tag,
in einem aktuellen Programm soll eine Outlook-Integration implementiert werden. Der Aufruf des Outlook "Neue E-Mail-Fensters" wird bereits per Programmcode abgearbeitet.
Dim lo_NSpace As Microsoft.Office.Interop.Outlook.NameSpace
Dim lo_Folder As Microsoft.Office.Interop.Outlook.MAPIFolder
Dim lo_OutApp As Microsoft.Office.Interop.Outlook.Application
Dim lo_Item As Microsoft.Office.Interop.Outlook.MailItem
lo_OutApp = New Microsoft.Office.Interop.Outlook.Application()
lo_NSpace = lo_OutApp.GetNamespace("MAPI")
lo_Folder = lo_NSpace.GetDefaultFolder(Microsoft.Office.Interop.Outlook.OlDefaultFolders.olFolderSentMail)
lo_Item = DirectCast(lo_Folder.Items.Add(Microsoft.Office.Interop.Outlook.OlItemType.olMailItem), Microsoft.Office.Interop.Outlook.MailItem)
lo_Item.[To] = "Test@test.de"
lo_Item.BodyFormat = Microsoft.Office.Interop.Outlook.OlBodyFormat.olFormatRichText
lo_Item.Subject = "Testbetreff"
lo_Item.Body = "Dies ist eine Testnachricht"
'Neue E-Mail-Fenster anzeigen
lo_Item.Display(True)
Sobald nun die E-Mail abgesendet wurde, möchte ich die versendete E-Mail auslesen. Also den geschriebenen Text (Body) und evtl. Anlagen ermitteln.
Wie kann ich dies realisieren? Bis jetzt habe ich leider noch nichts adäquates gefunden.
Gruß Beppo
Habe das Ganze nun einfach mit dem normalen Popup gelöst. Es fehlen zwar hierbei einige Funktionalitäten, aber aktuell reicht es.
Somit kann ich den Thread als Erledigt markieren.
Gruß Beppo
Danke für die Antworten.
rechner hatte bei seiner Vermutung recht, ich möchte gerne die Endpunkte einzeln ansprechen.
Da ich aber dem Konstruktor des Proxys für den WCF-Service den Endpoint mitgeben kann, könnte ich an dieser Stelle auch zwischen den Entpunkten unterscheiden.
AutoService = New AutoServiceClient("BasicAutoServiceEndpoint")
oder
AutoService = New AutoServiceClient("StreamAutoServiceEndpoint")
Somit dürfte sich mein Problem wohl gelöst haben 😁
Gruß Beppo
Guten Tag,
ich habe eine Frage zum Thema WCF und mehrere Endpoints. In meinem Testprogramm habe ich zwei Endpoints definiert. Der erste Endpoint (BasicAutoServiceEndpoint) wird standardmäßig für alle WCF-Anfragen verwendet.
Nun habe ich noch einen zweiten Endpoint (StreamAutoServiceEndpoint) definiert, welcher speziell für das Streaming von Bildern gedacht ist.
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding name="BasicAutoServiceEndpoint" closeTimeout="00:01:00"
openTimeout="00:01:00" receiveTimeout="00:10:00" sendTimeout="00:01:00"
allowCookies="true" bypassProxyOnLocal="false" hostNameComparisonMode="StrongWildcard"
maxBufferSize="65536" maxBufferPoolSize="524288" maxReceivedMessageSize="65536"
messageEncoding="Text" textEncoding="utf-8" transferMode="Buffered"
useDefaultWebProxy="true">
<readerQuotas maxDepth="32" maxStringContentLength="8192" maxArrayLength="16384"
maxBytesPerRead="4096" maxNameTableCharCount="16384" />
<security mode="None">
<transport clientCredentialType="None" proxyCredentialType="None"
realm="" />
<message clientCredentialType="UserName" algorithmSuite="Default" />
</security>
</binding>
<binding name="StreamAutoServiceEndpoint" allowCookies="true"
messageEncoding="Mtom" transferMode="Streamed" />
</basicHttpBinding>
</bindings>
<client>
<endpoint address="http://myadresse/AutoService.svc"
binding="basicHttpBinding" bindingConfiguration="BasicAutoServiceEndpoint"
contract="IAutoService" name="BasicAutoServiceEndpoint" />
<endpoint address="http://myadresse/AutoService.svc"
binding="basicHttpBinding" bindingConfiguration="StreamAutoServiceEndpoint"
contract="IAutoService" name="StreamAutoServiceEndpoint" />
</client>
</system.serviceModel>
Ich möchte nun, dass meine implementierte Methode im Progamm, ich nenne diese jetzt mal "GetImage" immer den Service-Endpoint für das Streaming (StreamAutoServiceEndpoint) verwendet und nicht den "normalen" (BasicAutoServiceEndpoint) Service-Endpoint. Wie realisiere ich dies nun am besten?
Gruß Beppo
Ich weiß zwar nicht ob die Lösung meines Problems jemanden weiterhilft, jedoch möchte ich euch diese nicht vorenthalten.
In meinem speziellen Fall reichte es, den asynchronen Aufruf:
Deleg.DynamicInvoke()
durch den synchronen Aufruf:
System.Windows.Threading.Dispatcher.CurrentDispatcher.Invoke(Deleg, System.Windows.Threading.DispatcherPriority.Send)
zu ersetzen. Dies hat zur Folge, dass der Hauptthread solange wartet, bis der Nebenthread abgearbeitet ist.
Gruß Beppo
So, nachdem ich das Problem nun gelöst habe kann ich euch mitteilen, dass das Problem nicht mit obigen Code in Zusammenhang stand.
Der Code funktioniert also lokal sowie remote einwandfrei.
Vielen Dank nochmals für die Hilfe.
Gruß Beppo
Hey =)
bin jetzt auch wieder aus dem Urlaub zurück =) Hast du in der Zwischenzeit schon wieder Zugriff auf den Server bekommen um mir eventuell den Source-Code für das Popup zukommen zu lassen?
Gruß Beppo
Anscheinend habe ich jetzt doch mit dem obigen Code ein Problem.
In einer WebService-Funktion ermittle ich mit obigen Code den Pfad des App_Data Verzeichnises. Der WebService wird von einer XBAP-Anwendung eingebunden.
Solange ich die Applikation lokal ausführe funktioniert alles einwandfrei. Sobald ich die Applikation mit WebService aber auf einem Server im lokalen Netzwerk veröffentliche und die XBAP herunterlade, hat er anscheinend ein Problem mit dem obigen Code.
Meiner Einschätzung nach ermittelt er auf dem Server den Pfad falsch 🤔
Kann mir hierbei vielleicht jemand weiterhelfen?
Gruß Beppo
Hey 😉,
könntest du mir noch das Beispiel für die Popups schicken? Wäre wirklich sehr nett.
Habe momentan wieder ein Problem mit dem Veröffentlichen der Anwendung auf einem anderen IIS-Server, lokal habe ich es nun endlich geschafft 😉
Folgender Sachverhalt:
Der WCF-Dienst wurde auf einen anderen IIS7 Server kopiert und funktioniert auch.
In der Konfigurationsdatei der Anwendung wurde der FQDN des WebServices als Endpunkt angegeben.
Ansonsten habe ich keine Stelle mehr gefunden, an welcher ein Link angegeben wird.
Die Anwendung wird wie weiter oben im Thread schon erläutert, veröffentlicht. Also auf C:/Publish in als URL Installationsverzeichnis wieder der FQDN. (auf dem entfernten IIS)
Wenn ich die Anwendung lokal veröffentliche und teste, funktioniert auch alles. Sobald ich die Anwendung auf einem entfernten IIS7-Server veröffentliche, bekomme ich WebPermission Berechtigungsprobleme mit dem WCF-Service 😕
Hast du vielleicht noch eine Idee?
Gruß Beppo
Guten Tag,
ich habe aktuell ein Problem mit dem Threading in XBAP.
Folgendes Szenario:
Beim Laden der Anwendung wird ein SplashScreen aufgerufen. Beim Initalisieren des SplashScreens wird ein neuer Thread gestartet, welcher die benötigten Daten im Hintergrund besorgt.
bw = New Thread(AddressOf WorkThread)
bw.Start()
Public Sub WorkThread()
Try
'In der Variable Deleg ist die abzuarbeitenden Methode hinterlegt
Deleg.DynamicInvoke()
Catch ex As Exception
Exception = ex.InnerException
Finally
bolGestartet = False
'Delegate zum schließen des Formulars
Dispatcher.BeginInvoke(_closeDelegate)
bw.Abort()
End Try
Im Anschluss daran, wird der Hauptthread für 500 Millisekunden schlafen gelegt. Sollte der andere Thread in dieser Zeit noch nicht fertig sein, also bolGestartet noch nicht auf False stehen, so wird der FlashScreen angezeigt.
bw = New Thread(AddressOf WorkThread)
bw.Start()
bolGestartet = True
Call InitializeComponent()
Thread.Sleep(500)
If bolGestartet Then
Me.ShowDialog()
[COLOR] ... sonstiger Code
[/color]
End If
Wie man aus dem Code entnehmen kann, wird der SplashScreen nach der Abarbeitung des WorkThreads per Code geschlossen. (Mit _closeDelegate)
Erst nach dem Schließen des SplashScreens, welcher modal angezeigt wird, arbeitet der Hauptthread weiter. ( ... sonstiger Code)
Nun habe ich aber das Problem, dass ich nun den SplashScreen auf ein Popup umstellen muss und dieses nicht modal angezeigt wird 😦
D.h. der restliche Code ( ... sonstiger Code) wird sofort nach der Anzeige des Popups ausgeführt. Genau dies möchte ich aber nicht. Ich möchte also, dass auch hier solange gewartet wird, bis der andere Thread mit der Abarbeitung fertig ist.
Weiß jemand dazu eine Lösung?
Gruß Beppo
Hey =)
gut zu wissen, dass das mit dem Fensterschließen eine etwas aufwändigere Sache ist, dann stelle ich das im Momentan einmal hinten an 😉
Für eine Beispielanwendung wäre ich sehr dankbar, ich habe beim Popup auch immer noch das Problem, dass dieses keine Property "Background" aufweist und deshalb der Hintergrund immer Schwarz ist.
Hast du dann für das Popup ein Page-Element verwendet? Aber das sehe ich dann hoffentlich eh in der Beispielanwendung 😉
Gruß Beppo
Ja, kein Problem. Helfe dir natürlich gerne, hast mir ja auch ziemlich weitergeholfen.
Danke für die Info mit dem Threading. Hatte mit einem etwas blöden Problem zu kämpfen (Popups), weshalb sich die grundlegende Frage stellte, ob es überhaupt möglich sei. In der Zwischenzeit konnte ich aber den Fehler finden und ein Workaround bauen.
Momentan sind wieder Fragen aufgetaucht, bei welchen du mir vielleicht noch helfen könntest:
Wie kann ich eine XBAP-Anwendung per Code schließen, also letztendlich den Browsertab?
Wie hast du das Ganze Problem mit den Popups gelöst?
2a. Ich habe es z.B. bis jetzt noch nicht hibekommen, dass man die Popups verschieben kann.
2b. Das Größte Problem momentan ist bei mir, dass die Popups nicht modal angezeigt werden. D.h. es wird z.B. nicht gewartet, bis Ok oder Abbrechen gedrückt wurde.
Vielleicht kannst du mir noch ein bisschen helfen 😉
Gruß Beppo
Vielen Dank für deine schnelle und kompetente Antwort. Hast mir bei meinem Problem gut weitergeholfen.
Um das Ganze letztendlich "sauber" zu gestalten, wird im fortgeschrittenen Stadium der gemeinsame Inhalt in ein UserControl (WPF) ausgelagert.
Aber bei einer Stelle habe ich noch ein Problem: Ich kann zwar die Methode überladen, aber kannst du mir vielleicht aufzeigen, wie du dies genau in meinem Fall machen würdest?
Gruß Beppo
Hallo,
ich habe wahrscheinlich hier ein sehr leichtes Problem, komme aber irgendwie nicht drauf, wie ich es lösen soll.
Ich habe eine Methode, welche als Übergabeparameter ein Objekt vom Typ DialogWindow empfängt. Jetzt soll es aber auch möglich sein, dass die Methode ein Objekt vom Typ DialogPopup empfängt.
Wie kann ich sowas realisieren?
Im Anschluss wird auf spezifische Elemente des DialogPopups oder DialogWindow zugegriffen. Die Elemente der beiden Objekte sind jedoch gleich.
Private Sub SetButtons(ByVal obj As DialogWindow)
obj.btnCancel.Visibility = Visibility.Collapsed
obj.btnNo.Visibility = Visibility.Collapsed
obj.btnYes.Visibility = Visibility.Collapsed
End Sub
Gruß Beppo
Hallo!
Ich war im Urlaub 🙂 Wie sieht denn der aktuelle Stand aus? Hoffentlich nicht aufgegeben?
Hey,
schön das du dich nochmal hier im Thread meldest. Also der aktuelle Stand sieht so aus, dass ich die Implementierung mit WCF + Session geschafft habe. Die Anwendung läuft auch im Debug-Modus mit Partial-Trust Internet einwandfrei.
Nun gibt es aber im Moment noch folgende Probleme:
Das veröffentlichen der Anwendung funktioniert noch nicht ganz, gleich zu Beginn des Downloads der Anwendung bricht er mit einer Fehlermeldung aufgrund fehlender Berechtigungen ab:
FEHLERZUSAMMENFASSUNG
Es folgt eine Zusammenfassung der Fehler. Details zu diesen Fehlern werden später im Protokoll aufgelistet.
* Ausnahme beim Ermitteln der Vertrauensstellung. Folgende Fehlermeldungen wurden entdeckt:
+ Der Benutzer hat es abgelehnt, der Anwendung die erforderlichen Berechtigungen zu erteilen.
* Ausnahme beim Downloaden der Anwendung. Folgende Fehlermeldungen wurden entdeckt:
+ Fehler bei der AssertApplicationRequirements-Methode. Ein Commit der Anwendung ist nicht möglich.
Der Webservice und die XBAP liegen im gleichen Verzeichnis auf dem IIS und alle sind in der gleichen SiteOfOrigin mit Angabe des FQDN.
Das zweite Problem ist momentan noch, dass ich nicht wirklich weiß, ob eine XBAP-Anwendung Threading unterstützt. Kannst du mir an diesem Punkt vielleicht etwas weiterhelfen?
PS: Ich hoffe du hattest einen schönen Urlaub =)
Gruß Beppo
Das Popup hat doch sicher ein Loaded-Event. Versuch doch dort dich in der Bildschirmmitte zu platzieren.
Wenn das funktioniert solltest du dich allerdings im Loaded-Handler vom diesen Event wieder abmelden. Dieses Event kommt evtl. öfters als einmal.
Also das Load-Event funktioniert irgendwie bei einem Popup grundsätzlich nicht, weshalb ich das Opened-Event verwendet habe.
Leider lässt sich in diesem Event das Popup mit diesem Code nicht platzieren:
Dim douTop As Double = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height - Me.objThumb.ActualHeight) / 2
Dim douLeft As Double = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width - Me.objThumb.ActualWidth) / 2
Me.PlacementRectangle = New Rect(douLeft, douTop, Me.objThumb.ActualWidth, Me.objThumb.ActualHeight)
Grundsätzlich schaffe ich es irgendwie nicht, das Element richtig zentriert zu platzieren.
Hier mein Testcode:
Private Sub Popup_MouseMove(ByVal sender As Object, ByVal e As MouseEventArgs)
If e.LeftButton = MouseButtonState.Pressed Then
Dim Position As Point = e.GetPosition(Nothing)
'Nur wenn die Maus ein wirklich bewegt wurde, wird das Fenster auch verschoben
If Math.Abs(Position.X - startPoint.X) > SystemParameters.MinimumHorizontalDragDistance OrElse Math.Abs(Position.Y - startPoint.Y) > SystemParameters.MinimumVerticalDragDistance Then
'Wenn noch kein PlacementRectangle angegeben wurde
If Double.IsInfinity(Me.PlacementRectangle.Top) AndAlso Double.IsInfinity(Me.PlacementRectangle.Left) Then
'Berechnung der zentralen Fensterposition (Koordinaten der Linke obere Ecke)
Dim douTop As Double = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height - Me.objThumb.ActualHeight) / 2
Dim douLeft As Double = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width - Me.objThumb.ActualWidth) / 2
douTop += Position.Y - startPoint.Y
douLeft += Position.X - startPoint.X
Me.PlacementRectangle = New Rect(douLeft, douTop, Me.objThumb.ActualWidth, Me.objThumb.ActualHeight)
Else
'Mousedelta berechnen
Dim douLeft As Double = Position.X - startPoint.X
Dim douTop As Double = Position.Y - startPoint.Y
Me.PlacementRectangle = New Rect(Me.PlacementRectangle.X + douLeft, Me.PlacementRectangle.Y + douTop, Me.PlacementRectangle.Width, Me.PlacementRectangle.Height)
End If
End If
End If
End Sub
Private Sub Popup_MouseLeftButtonDown(ByVal sender As Object, ByVal e As MouseEventArgs)
startPoint = e.GetPosition(Nothing)
End Sub
<Grid>
<Thumb x:Name="objThumb" Background="Blue" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
<!-- Control einbinden -->
<Grid x:Name="MainGrid" Background="White" >
</Grid>
</Grid>
Mit dem oben aufgeführten Code ist es zwar bereits möglich, dass Popup zu verschieben, jedoch funktioniert das zentrierte platzieren einfach noch nicht. Das Popup wird immer noch verschoben platziert. X(
Gruß Beppo
Ich weis nicht welcher Wert in PlacementRectangle steht wenn man ihn nicht belegt. Vermutlich ein Default-Rect.
An deiner Stelle würde ich auch dieses Rect verändern. Im Popup einfach einen Thumb hinzufügen und im DragDelta das Rect verändern.
Also mit dem Standardwert des PlacementRectangle kann ich leider nicht viel anfangen. (siehe Anhang)
Also das mit dem Thumb und dem DragDelta ist eine gute Idee. Jetzt stellt sich nur noch die Frage, wie ich am besten bei der Erstellung des Popups ein anständiges PlacementRectangle definieren kann.
Gruß Beppo
ActualWidth/Height ist verfügbar nachdem Arrange aufgerufen wurde, also nachdem das Popup platziert wurde.
Ok, danke nochmals für den Hinweis. Sobald nämlich auf ActualWidth/Height nach myPopupPage.IsOpen = True zugegriffen wird, sind die Werte auch vorhanden.
Wie möchtest du das Popup verschieben? Willst du es per Maus verschieben oder per Code einmalig platzieren?
Das Popup möchte ich per Maus verschieben können, also wie ein ganz normales Window. Deshalb möchte ich das Popup auch gleich zu Beginn per PlacementRectangle platzieren, weil ich auf diese Eigenschaft später beim Verschieben des Fenster wieder zugreifen kann und es dementsprechend platzieren kann.
Ich könnte zwar das Fenster auch so platzieren:
myPopupPage.Placement = Primitives.PlacementMode.Center
Jedoch finde ich zur Laufzeit dann irgendwie keine Möglichkeit, die Position des Popups zu ermitteln X(
Oder hast du vielleicht eine andere Lösung wie ich ein normales Popup so modifizieren kann, dass es wie ein normales Window verschiebbar ist?
Gruß Beppo
Hallo,
ich habe aktuell ein Problem mit der Erstellung eines Popups und der Platzierung dieses Popups. Das Popup wird in einer Methode erstellt und anschließend auf einer Page platziert.
Damit das Popup anschließend bewegt werden kann (wie ein normales Fenster), habe ich vor, dass Popup manuell zu platzieren, damit PlacementRectangle bereits einen Wert hat. Leider taucht im Code das Problem auf, dass zum Zeitpunkt der Erstellung myPopupPage.recPosition.ActualHeight den Wert 0 aufweist, was darauf zurückzuführen ist, dass das ganze noch nicht gerendert wurde.
Wie kann ich das umgehen?
Der Code myPopupPage.UpdateLayout() brachte leider auch nicht den erwünschten Erfolg.
Hier ist der Beispielcode:
'Popupfenster anzeigen
Dim myPopupPage As New PopupPage
myPopupPage.MainGrid.Children.Add(New Adresse)
myPopupPage.PlacementTarget = Helper.GetParentPage(Me)
Dim douTop As Double = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height - myPopupPage.recPosition.ActualHeight) / 2
Dim douLeft As Double = (System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width - myPopupPage.recPosition.ActualWidth) / 2
myPopupPage.PlacementRectangle = New Rect(douLeft, douTop, myPopupPage.recPosition.ActualWidth, myPopupPage.recPosition.ActualHeight)
myPopupPage.IsOpen = True
myPopupPage.StaysOpen = True
<Grid>
<Rectangle x:Name="recPosition" Stretch="Fill" Fill="Red"/>
<!-- Control einbinden -->
<Grid x:Name="MainGrid" Background="White" >
</Grid>
</Grid>
Vielleicht hat von euch auch jemand ein Idee wie ich es anders schaffe, das Popup später einfach verschieben zu können.
Gruß Beppo
Hallo,
in Visual Studio 2008 kann man in den Einstellung die XML-Dokumentationskommentare für C# festlegen, sodass diese automatisch nach /// generiert werden.
Leider habe ich jetzt das Problem, dass Visual Studio nicht mehr automatisch XML-Dokumentationskommentare für VB nach Eingabe von ''' festlegt.
In den Einstellungen finde ich dazu leider nichts passendes.
Kennt dieses Problem von euch vielleicht jemand und kann mir dabei weiterhelfen?
Gruß Beppo
Das war mal wieder ein behinderter Fehler 🙁
Hatte bei der XBAP-Anwendung den falschen Pfad bei "Browser mit folgender URL starten" eingetragen. Somit startete der Debugger automatisch eine alte Version und nicht die aktuelle X(
Nachdem ich den Pfad jetzt angepasst habe, funktioniert das debuggen wieder einwandfrei.
Gruß Beppo
Das sieht sehr gut aus =)
Vielen Dank für die Hilfe zur Lösung meines Problems und sorry für die eventuell unklare Problemstellung 😉
Gruß Beppo
Mein Problem sind jetzt eigentlich nicht die Methoden, sondern der Dateizugriff selbst.
Wenn ich z.B. im WCF-Service versuche, dass aktuelle Verzeichnis auszulesen, bekomme ich folgendes Ergebnis:
Dim DInfo As New System.IO.DirectoryInfo(".")
--> FullName: C:\WINDOWS\system32
Wie kann ich nun mit System.IO.File(?) auf z.B. die Datei "Daten.txt" im Verzeichnis C:\Inetpub\wwwroot\Projektname\App_Data vom WebService aus zugreifen? Also wie finde ich den Pfad zum App_Data-Verzeichnis vom Webservice raus?
Gruß Beppo
Dein WCF Service läuft nicht im Partial Trust.
Du kannst einfach darauf zugreifen, da er nur die Restriktionen vom Webserver hat und als Dienst darf er auf das Verzeichnis zugreifen.
Danke schon einmal für deine Antwort.
Aber bis zu diesem Punkt bin ich auch schon gekommen 😉 Ich glaube meine Frage ist einfach zu leicht 😉
Ich habe einen WCF-WebService, welcher auf dem lokalen IIS 6.0 läuft. Auf dem lokalen IIS habe ich unter dem Pfad C:\Inetpub\wwwroot\Projektname\App_Data eine Datei hinterlegt, auf welche ich vom WebService aus zugreifen möchte.
Wie mache ich jetzt das, also wie greife ich ganz normal auf die Datei zu?
Gruß Beppo
Hallo,
ich habe einen WCF-Service, welcher von einer XBAP-Anwendung aufgerufen wird. Da ich aber über die XBAP-Anwendung durch Partial-Trust keine Rechte für den Dateizugriff habe, möchte ich diesen über den WCF-Service realisieren.
Leider habe ich jetzt wohl eine sehr einfache Frage. Ich möchte vom Webservice auf das App_Data-Verzeichnis des WCF-Services zugreifen, welches auf dem IIS liegt.
Meine Dateien liegen also im App_Data-Verzeichnis auf dem IIS.
Wie realisiere ich sowas?
Vielen Dank bereits jetzt für die Antwort.
Gruß Beppo
Hey michlG,
danke für deine schnelle und informative Antwort. Habe jetzt die von dir und in den Links erläuterten Schritte befolgt und konnte leider keine Besserung feststellen.
Auch
Hast du schon folgende Schritte versucht?
Erstellen -> Projekt bereinigen
Erstellen -> Projekt erstellen
Erstellen -> Projekt neu erstellen
brachte leider nichts.
Durch Zufall bin ich jetzt aber auf was anderes gestoßen, was mit dem Ganzen zusammenhängen könnte. Anlage A zeigt einen Screenshot der Projektmappeneigenschaften, in welcher die benötigte Datei eingetragen war.
Seitdem ich dort die Datei wieder ausgetragen habe, erscheint nun folgende Warn/Fehlermeldung (Anlage B). Wenn ich den Dialog mit JA verlasse, so kann ich in die gewünschte Funktion debuggen, was vorher nicht ging.
Mit was könnte dies zusammenhängen?
Leider kann ich aber dann immer noch keine beliebigen Breakpoints z.B. in Events setzen, da er diese immer noch ignoriert 🤔
PS: Ist die andere Assembly von dir?
Ja, die Assembly wurde von mir programmiert.
Gruß Beppo